660 lines
464 KiB
HTML
660 lines
464 KiB
HTML
|
<!DOCTYPE html>
|
|||
|
<html><head><title>Linux 日志管理</title><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><meta property="og:title" content="Linux 日志管理"/><meta property="og:description" content="Linux 日志管理."/><meta property="og:image" content="https://wiki.7wate.com/static/og-image.png"/><meta property="og:width" content="1200"/><meta property="og:height" content="675"/><link rel="icon" href="../../../../static/icon.png"/><meta name="description" content="Linux 日志管理."/><meta name="generator" content="Quartz"/><link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com"/><script async src="https://umami.7wate.com/script.js" data-website-id="c061efdc-95dd-4d21-9d04-a1ffda0a85b9"></script><script>
|
|||
|
var _hmt = _hmt || [];
|
|||
|
(function() {
|
|||
|
var hm = document.createElement("script");
|
|||
|
hm.src = "https://hm.baidu.com/hm.js?94d8ccb156eb7c65abf317e6e01cdba9";
|
|||
|
var s = document.getElementsByTagName("script")[0];
|
|||
|
s.parentNode.insertBefore(hm, s);
|
|||
|
})();
|
|||
|
</script><script async src="https://www.googletagmanager.com/gtag/js?id=G-MHMEL0F832"></script><script>
|
|||
|
(function() {
|
|||
|
window.dataLayer = window.dataLayer || [];
|
|||
|
function gtag() {
|
|||
|
window.dataLayer.push(arguments);
|
|||
|
}
|
|||
|
gtag('js', new Date());
|
|||
|
gtag('config', 'G-MHMEL0F832');
|
|||
|
})();
|
|||
|
</script><link href="../../../../index.css" rel="stylesheet" type="text/css" spa-preserve/><link href="https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css" rel="stylesheet" type="text/css" spa-preserve/><link href="https://fonts.googleapis.com/css2?family=IBM Plex Mono&family=Schibsted Grotesk:wght@400;700&family=Source Sans Pro:ital,wght@0,400;0,600;1,400;1,600&display=swap" rel="stylesheet" type="text/css" spa-preserve/><script src="../../../../prescript.js" type="application/javascript" spa-preserve></script><script type="application/javascript" spa-preserve>const fetchData = fetch(`../../../../static/contentIndex.json`).then(data => data.json())</script></head><body data-slug="Tech/operating-system/Linux/4.系统管理/Linux-日志管理"><div id="quartz-root" class="page"><div id="quartz-body"><div class="left sidebar"><h1 class="page-title "><a href="../../../..">📚 X·Eden</a></h1><div class="spacer mobile-only"></div><div class="search "><div id="search-icon"><p>Search</p><div></div><svg tabIndex="0" aria-labelledby="title desc" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 19.9 19.7"><title id="title">Search</title><desc id="desc">Search</desc><g class="search-path" fill="none"><path stroke-linecap="square" d="M18.5 18.3l-5.4-5.4"></path><circle cx="8" cy="8" r="7"></circle></g></svg></div><div id="search-container"><div id="search-space"><input autocomplete="off" id="search-bar" name="search" type="text" aria-label="Search for something" placeholder="Search for something"/><div id="results-container"></div></div></div></div><div class="darkmode "><input class="toggle" id="darkmode-toggle" type="checkbox" tabIndex="-1"/><label id="toggle-label-light" for="darkmode-toggle" tabIndex="-1"><svg xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" version="1.1" id="dayIcon" x="0px" y="0px" viewBox="0 0 35 35" style="enable-background:new 0 0 35 35;" xmlSpace="preserve"><title>Light mode</title><path d="M6,17.5C6,16.672,5.328,16,4.5,16h-3C0.672,16,0,16.672,0,17.5 S0.672,19,1.5,19h3C5.328,19,6,18.328,6,17.5z M7.5,26c-0.414,0-0.789,0.168-1.061,0.439l-2,2C4.168,28.711,4,29.086,4,29.5 C4,30.328,4.671,31,5.5,31c0.414,0,0.789-0.168,1.06-0.44l2-2C8.832,28.289,9,27.914,9,27.5C9,26.672,8.329,26,7.5,26z M17.5,6 C18.329,6,19,5.328,19,4.5v-3C19,0.672,18.329,0,17.5,0S16,0.672,16,1.5v3C16,5.328,16.671,6,17.5,6z M27.5,9 c0.414,0,0.789-0.168,1.06-0.439l2-2C30.832,6.289,31,5.914,31,5.5C31,4.672,30.329,4,29.5,4c-0.414,0-0.789,0.168-1.061,0.44 l-2,2C26.168,6.711,26,7.086,26,7.5C26,8.328,26.671,9,27.5,9z M6.439,8.561C6.711,8.832,7.086,9,7.5,9C8.328,9,9,8.328,9,7.5 c0-0.414-0.168-0.789-0.439-1.061l-2-2C6.289,4.168,5.914,4,5.5,4C4.672,4,4,4.672,4,5.5c0,0.414,0.168,0.789,0.439,1.06 L6.439,8.561z M33.5,16h-3c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5h3c0.828,0,1.5-0.672,1.5-1.5S34.328,16,33.5,16z M28.561,26.439C28.289,26.168,27.914,26,27.5,26c-0.828,0-1.5,0.672-1.5,1.5c0,0.414,0.168,0.789,0.439,1.06l2,2 C28.711,30.832,29.086,31,29.5,31c0.828,0,1.5-0.672,1.5-1.5c0-0.414-0.168-0.789-0.439-1.061L28.561,26.439z M17.5,29 c-0.829,0-1.5,0.672-1.5,1.5v3c0,0.828,0.671,1.5,1.5,1.5s1.5-0.672,1.5-1.5v-3C19,29.672,18.329,29,17.5,29z M17.5,7 C11.71,7,7,11.71,7,17.5S11.71,28,17.5,28S28,23.29,28,17.5S23.29,7,17.5,7z M17.5,25c-4.136,0-7.5-3.364-7.5-7.5 c0-4.136,3.364-7.5,7.5-7.5c4.136,0,7.5,3.364,7.5,7.5C25,21.636,21.636,25,17.5,25z"></path></svg></label><label id="toggle-label-dark" for="darkmode-toggle" tabIndex="-1"><svg xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" version="1.1" id="nightIcon" x="0px" y="0px" viewBox="0 0 100 100" style="enable-background='new 0 0 100 100'" xmlSpace="preserve"><title>Dark mode</title><path d="M96.76,66.458c-0.853-0.852-2.15-1.064-3.23-0.534c-6.063,2.991-12.858,4.571-19.655,4.571 C62.022,70.495,50.88,65.88,42.5,57.5C29.043,44.043,25.658,23.536,34.076,6.47c0.532-1.08,0.318-2.379-0.534-3.23 c-0.851-0.852-2.15-1.064-3.23-0.534c-4.918,2.427-9.375,5.619-13.246,9.491c-9.447,9.447-14.65,22.
|
|||
|
<p>在复杂的信息技术世界中,Linux 系统因其高效、稳定、开源的特性而广泛应用于服务器、云计算以及各类嵌入式系统中。有效的系统管理不仅要求对 Linux 系统有深入的理解,还需要掌握各种工具和技术以保证系统的可靠运行和高效故障排查。特别是日志管理,作为系统管理的核心部分,对于监控系统健康状况、分析系统问题具有不可或缺的作用。</p>
|
|||
|
<h2 id="linux-日志系统">Linux 日志系统<a aria-hidden="true" tabindex="-1" href="#linux-日志系统" class="internal"> §</a></h2>
|
|||
|
<p>Linux 日志文件是记录系统运行状态、软件错误信息、用户操作以及各种系统事件的文件。它们对于系统安全审计、故障诊断和性能分析等任务至关重要。</p>
|
|||
|
<h3 id="常见日志文件">常见日志文件<a aria-hidden="true" tabindex="-1" href="#常见日志文件" class="internal"> §</a></h3>
|
|||
|
<p>Linux 系统中的日志文件通常存储在 <code>/var/log</code> 目录下。这个目录中有许多文件和子目录,用于记录各种不同类型的日志。以下是其中一些重要的日志文件:</p>
|
|||
|
<ol>
|
|||
|
<li><code>/var/log/syslog</code> 或 <code>/var/log/messages</code>:这两个文件通常包含系统和应用程序的所有非安全日志消息。哪个文件被使用取决于你的发行版和配置。</li>
|
|||
|
<li><code>/var/log/auth.log</code> 或 <code>/var/log/secure</code>:这些文件记录所有的安全授权信息,包括用户认证、sudo 操作等。</li>
|
|||
|
<li><code>/var/log/kern.log</code>:该文件记录所有的内核相关消息。</li>
|
|||
|
<li><code>/var/log/dmesg</code>:保存由 dmesg 命令显示的内核环形缓冲区的消息。</li>
|
|||
|
<li><code>/var/log/boot.log</code>:记录系统启动过程中的信息。</li>
|
|||
|
<li><code>/var/log/faillog</code>:这个文件记录所有的登录失败尝试。它可以帮助管理员跟踪并阻止潜在的非法活动。</li>
|
|||
|
<li><code>/var/log/maillog</code> 或 <code>/var/log/mail.log</code>:这两个文件记录与电子邮件系统相关的所有日志信息。包括邮件传送、接收,以及任何可能发生的错误。</li>
|
|||
|
<li><code>/var/log/journal/</code>:此目录包含了 systemd 日志服务(journald)的二进制日志文件。它们包含了系统启动以来的所有日志消息。</li>
|
|||
|
<li><code>/var/log/lastlog</code>:此文件记录了系统上每个账户的最后登录时间。管理员可以使用这个日志来跟踪用户活动。</li>
|
|||
|
<li><code>/var/log/wtmp</code> 和 <code>/var/log/btmp</code>:这两个文件分别记录了成功和失败的登录尝试。通过检查这些文件,管理员可以发现潜在的安全问题。</li>
|
|||
|
<li><code>/var/log/Xorg.0.log</code>:此文件记录了 X Window 系统的日志,主要用于调试 X 服务器的问题。</li>
|
|||
|
</ol>
|
|||
|
<p>理解这些日志文件的内容和它们所在的位置,对于日常的系统维护、问题诊断和安全审计都非常重要。在实际使用中,还需要结合具体的发行版和配置,以及具体的应用程序和服务的需求,来进行灵活的操作和管理。</p>
|
|||
|
<h2 id="日志管理工具">日志管理工具<a aria-hidden="true" tabindex="-1" href="#日志管理工具" class="internal"> §</a></h2>
|
|||
|
<h3 id="journalctl-日志管理"><code>journalctl</code> 日志管理<a aria-hidden="true" tabindex="-1" href="#journalctl-日志管理" class="internal"> §</a></h3>
|
|||
|
<p>Systemd 是一个系统和服务管理器,它提供了对服务的并行启动、日志记录和系统初始化的能力。Systemd 使用 <code>journald</code>,一个日志收集守护进程,来收集和管理日志信息。与传统的基于文本文件的日志系统(如通过 <code>syslog</code> 或直接写入 <code>/var/log</code> 的方式)相比,<code>journald</code> 提供了一些优势:</p>
|
|||
|
<ul>
|
|||
|
<li><strong>集中管理</strong>:<code>journald</code> 收集系统启动、应用程序和内核的日志信息,提供了一个统一的日志入口。</li>
|
|||
|
<li><strong>性能和可靠性</strong>:<code>journald</code> 可以在系统崩溃后保留日志信息,提高了日志的可靠性。同时,它还支持日志的按需加载,改善了大量日志处理的性能问题。</li>
|
|||
|
<li><strong>高级查询</strong>:通过 <code>journalctl</code> 工具,用户可以执行基于时间、服务、优先级等多维度的复杂日志查询,这在传统文本文件日志系统中难以实现。</li>
|
|||
|
</ul>
|
|||
|
<h4 id="日志文件的变化">日志文件的变化<a aria-hidden="true" tabindex="-1" href="#日志文件的变化" class="internal"> §</a></h4>
|
|||
|
<p>由于 <code>journald</code> 的引入,很多原本分散在 <code>/var/log</code> 中的日志文件,如 <code>auth.log</code>(用于记录认证日志)、<code>daemon.log</code>(用于记录系统守护进程的日志)等,现在可以通过 <code>journalctl</code> 命令统一查询。例如,原先查看 <code>auth.log</code> 的命令可能被替换为 <code>journalctl -u ssh.service</code>(查看 SSH 服务的日志)或者 <code>journalctl _SYSTEMD_UNIT=sshd.service</code>(同样的查询,但是使用不同的过滤方式)。</p>
|
|||
|
<h4 id="常用命令">常用命令<a aria-hidden="true" tabindex="-1" href="#常用命令" class="internal"> §</a></h4>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<table><thead><tr><th>功能描述</th><th>命令示例</th></tr></thead><tbody><tr><td>查看所有日志</td><td><code>journalctl</code></td></tr><tr><td>反向查看日志(最新的先显示)</td><td><code>journalctl -r</code></td></tr><tr><td>查看特定服务的日志</td><td><code>journalctl -u 服务名.service</code></td></tr><tr><td>按时间查看日志</td><td><code>journalctl --since "YYYY-MM-DD HH:MM:SS"</code></td></tr><tr><td></td><td><code>journalctl --until "YYYY-MM-DD HH:MM:SS"</code></td></tr><tr><td>实时跟踪日志输出</td><td><code>journalctl -f</code></td></tr><tr><td>查看此次启动的日志</td><td><code>journalctl -b</code></td></tr><tr><td>查看上一次启动的日志</td><td><code>journalctl -b -1</code></td></tr><tr><td>根据优先级过滤日志</td><td><code>journalctl -p err</code> (err, crit, warn, info 等)</td></tr><tr><td>显示日志的尾部 N 条记录</td><td><code>journalctl -n 数量</code></td></tr><tr><td>过滤特定时间段的日志</td><td><code>journalctl --since "昨天" --until "今天"</code></td></tr><tr><td>过滤特定进程的日志</td><td><code>journalctl _PID=进程号</code></td></tr><tr><td>查看特定用户的日志</td><td><code>journalctl _UID=用户ID</code></td></tr><tr><td>合并多个日志文件显示</td><td><code>journalctl -m</code></td></tr><tr><td>查看内核消息</td><td><code>journalctl -k</code></td></tr><tr><td>过滤特定系统单元及其优先级的日志</td><td><code>journalctl -u 服务名.service -p err</code></td></tr><tr><td>显示日志的详细输出</td><td><code>journalctl -o verbose</code></td></tr><tr><td>使用导出格式查看日志</td><td><code>journalctl -o json</code></td></tr><tr><td>指定日志标识符(SYSLOG_IDENTIFIER)过滤</td><td><code>journalctl SYSLOG_IDENTIFIER=标识符</code></td></tr></tbody></table>
|
|||
|
<h3 id="logwatch-日志分析工具"><code>Logwatch</code> 日志分析工具<a aria-hidden="true" tabindex="-1" href="#logwatch-日志分析工具" class="internal"> §</a></h3>
|
|||
|
<p><code>Logwatch</code> 是一个高度可定制和灵活的日志分析工具,广泛用于 Linux 和 Unix 系统。它自动分析和报告系统日志文件中的重要信息,使系统管理员能够轻松识别常见问题和潜在安全威胁。Logwatch 能够处理各种服务的日志,如 Apache、SSH、FTP 以及系统安全日志等。</p>
|
|||
|
<h4 id="主要特性">主要特性<a aria-hidden="true" tabindex="-1" href="#主要特性" class="internal"> §</a></h4>
|
|||
|
<ul>
|
|||
|
<li><strong>自动化日志分析</strong>:自动分析系统中的各种日志文件,并生成易于理解的摘要报告。</li>
|
|||
|
<li><strong>高度可定制</strong>:用户可以定制报告的内容、格式、详细程度以及报告周期,以满足不同的监控需求。</li>
|
|||
|
<li><strong>邮件报告</strong>:可以将日志分析报告通过电子邮件发送给系统管理员,便于及时审查。</li>
|
|||
|
<li><strong>支持多种服务和应用</strong>:Logwatch 具有广泛的服务和应用支持,包括但不限于系统安全、网络服务和邮件系统等。</li>
|
|||
|
</ul>
|
|||
|
<h4 id="配置选项">配置选项<a aria-hidden="true" tabindex="-1" href="#配置选项" class="internal"> §</a></h4>
|
|||
|
<p>Logwatch 的配置文件位于 <code>/usr/share/logwatch/default.conf/logwatch.conf</code>,也可以拷贝至 <code>/etc/logwatch/conf</code> 目录下,编写个人化配置文件。以下是一些可复用的 Logwatch 配置模板,你可以根据需求进行调整,并保存在 <code>/etc/logwatch/conf/</code> 目录下,以 <code>.conf</code> 结尾。例如:<code>custom.conf</code>。</p>
|
|||
|
<pre><code># 设置详细等级
|
|||
|
Detail = Low # 可选值:Low, Med, High
|
|||
|
# 设置输出方式
|
|||
|
Output = stdout # 可选值:stdout, mail
|
|||
|
# 设置报告范围
|
|||
|
Range = yesterday
|
|||
|
# 指定接收报告的邮件地址
|
|||
|
MailTo = admin@example.com
|
|||
|
# 指定发件人邮件地址
|
|||
|
MailFrom = logwatch@example.com
|
|||
|
</code></pre>
|
|||
|
<p>常见的命令选项包括:</p>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<table><thead><tr><th>选项</th><th>描述</th></tr></thead><tbody><tr><td><code>--detail</code></td><td>设置报告的详细级别(Low, Med, High 或具体数字)。</td></tr><tr><td><code>--output</code></td><td>指定输出类型(stdout, mail, file)。</td></tr><tr><td><code>--format</code></td><td>指定报告格式(html, text)</td></tr><tr><td><code>--mailto</code></td><td>当输出类型为 mail 时,指定接收报告的电子邮件地址。</td></tr><tr><td><code>--mailfrom</code></td><td>指定发送报告的电子邮件地址(仅当 <code>--output mail</code> 时有效)。</td></tr><tr><td><code>--range</code></td><td>指定报告的时间范围(today, yesterday, All, 或自定义范围如 <code>between -7 days and today</code>)。</td></tr><tr><td><code>--service</code></td><td>指定要包含在报告中的服务。多个服务可以通过重复此选项来指定。</td></tr><tr><td><code>--logfile</code></td><td>指定要分析的特定日志文件。多个日志文件可以通过重复此选项来指定。</td></tr><tr><td><code>--hostname</code></td><td>指定在报告中使用的主机名。</td></tr><tr><td><code>--config</code></td><td>指定一个自定义的配置文件路径(如前所述,这个选项实际上并不存在,配置应通过修改或添加 <code>/etc/logwatch/conf/</code> 目录下的文件来实现)。</td></tr><tr><td><code>--numeric</code></td><td>显示数字 IP 地址而不是主机名(对于某些服务日志)。</td></tr><tr><td><code>--archives</code></td><td>在分析日志时包括旧的日志档案。</td></tr><tr><td><code>--debug</code></td><td>打印调试信息,有助于故障排除。</td></tr></tbody></table>
|
|||
|
<h4 id="logwatch-日志命令">Logwatch 日志命令<a aria-hidden="true" tabindex="-1" href="#logwatch-日志命令" class="internal"> §</a></h4>
|
|||
|
<h3 id="logrotate-日志轮转"><code>logrotate</code> 日志轮转<a aria-hidden="true" tabindex="-1" href="#logrotate-日志轮转" class="internal"> §</a></h3>
|
|||
|
<p>日志文件可以在短时间内变得非常大,尤其是当系统或应用程序产生大量日志信息时。一个大的日志文件不仅会占用大量的磁盘空间,也会使日志分析变得复杂和耗时。这就是为什么日志旋转变得非常重要。</p>
|
|||
|
<p>日志旋转是一种解决方法,它会定期将旧的日志条目移动到新的文件中,同时管理和删除过旧的日志文件。在 Linux 系统中,这通常由 logrotate 实现。</p>
|
|||
|
<p><code>logrotate</code> 是一个用于管理日志文件的工具,它可以自动轮转、压缩、删除和邮件发送日志文件。在 Linux 系统中,许多程序都会生成日志文件,这些文件会随着时间的推移不断增长,<code>logrotate</code> 可以帮助系统管理员管理这些日志文件,防止它们占用过多的磁盘空间。</p>
|
|||
|
<p><code>logrotate</code> 的主要特性和功能:</p>
|
|||
|
<ul>
|
|||
|
<li>
|
|||
|
<p><strong>日志轮转</strong>:<code>logrotate</code> 可以按照日、周、月或者文件大小来轮转日志文件。这意味着当一个新的轮转周期开始时,当前的日志文件将被重命名,然后创建一个新的日志文件。例如,你可以配置 <code>logrotate</code> 每天轮转一次 <code>/var/log/messages</code> 文件,那么每天开始时,<code>/var/log/messages</code> 文件会被重命名为 <code>/var/log/messages.1</code>,然后创建一个新的 <code>/var/log/messages</code> 文件用于记录新的日志。</p>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p><strong>日志压缩</strong>:<code>logrotate</code> 可以自动压缩旧的日志文件以节省磁盘空间。默认情况下,它使用 <code>gzip</code> 进行压缩,但也可以配置使用其他压缩工具。</p>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p><strong>删除旧的日志文件</strong>:你可以配置 <code>logrotate</code> 自动删除超过一定时间的旧日志文件。例如,你可以配置 <code>logrotate</code> 只保留最近 30 天的日志文件。</p>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p><strong>邮件发送日志文件</strong>:如果你希望保存被删除的日志文件,可以配置 <code>logrotate</code> 在删除之前将日志文件发送到一个指定的电子邮件地址。</p>
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
<p><code>logrotate</code> 的配置文件通常位于 <code>/etc/logrotate.conf</code> 和 <code>/etc/logrotate.d/</code> 目录下。<code>/etc/logrotate.conf</code> 是主配置文件,定义了全局的配置选项。<code>/etc/logrotate.d/</code> 目录下的文件通常是各个程序的配置文件,例如 Apache、rsyslog、nginx 等。</p>
|
|||
|
<p>下面是一个 <code>logrotate</code> 配置文件的示例:<code>myapp</code> 的日志文件每天轮替,保留 5 份旧的日志文件。如果日志文件丢失或者为空,那么会忽略这个错误。轮替的日志文件会被压缩。新的日志文件将会以 0644 的权限创建,所有者为 root,组为 adm。每次日志轮替后,会重新加载 <code>myapp</code> 的配置。</p>
|
|||
|
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">/var/log/myapp/*.log</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">{</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">daily</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">rotate</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-constant);">5</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">missingok</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">notifempty</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">compress</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">create</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-constant);">0644</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">root</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">adm</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">sharedscripts</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">postrotate</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">/etc/init.d/myapp</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">reload</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">></span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/dev/null</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">endscript</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-color-text);">}</span></span></code></pre></div>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<table><thead><tr><th>选项</th><th>描述</th><th>示例</th></tr></thead><tbody><tr><td>rotate</td><td>指定你希望保存的旧日志文件的数量。</td><td><code>rotate 5</code></td></tr><tr><td>daily/weekly/monthly/yearly</td><td>定义了日志轮转的频率。</td><td><code>daily</code></td></tr><tr><td>compress</td><td>让 <code>logrotate</code> 使用 <code>gzip</code> 压缩旧的日志文件。</td><td><code>compress</code></td></tr><tr><td>delaycompress</td><td>让 <code>logrotate</code> 延迟压缩,直到下一次轮转周期。</td><td><code>delaycompress</code></td></tr><tr><td>missingok</td><td>如果日志文件丢失,<code>logrotate</code> 会忽略错误。</td><td><code>missingok</code></td></tr><tr><td>notifempty</td><td>如果日志文件为空,<code>logrotate</code> 会忽略它。</td><td><code>notifempty</code></td></tr><tr><td>create mode owner group</td><td>让 <code>logrotate</code> 创建新的日志文件,并设置指定的权限、所有者和组。</td><td><code>create 0644 root adm</code></td></tr><tr><td>postrotate/endscript</td><td>在 <code>postrotate</code> 和 <code>endscript</code> 之间的命令会在每次日志轮转之后执行。</td><td><code>postrotate /etc/init.d/apache2 reload endscript</code></td></tr><tr><td>sharedscripts</td><td>会使得 <code>logrotate</code> 对每个日志只运行一次 <code>postrotate</code> 脚本。</td><td><code>sharedscripts</code></td></tr></tbody></table>
|
|||
|
<h2 id="日志分析技巧">日志分析技巧<a aria-hidden="true" tabindex="-1" href="#日志分析技巧" class="internal"> §</a></h2>
|
|||
|
<h3 id="grep-文本搜索工具"><code>Grep</code> 文本搜索工具<a aria-hidden="true" tabindex="-1" href="#grep-文本搜索工具" class="internal"> §</a></h3>
|
|||
|
<p><code>grep</code> 是 Unix 和类 Unix 系统中的一个强大的文本搜索工具,用于搜索匹配特定模式的行。在日志文件中,你可以使用 <code>grep</code> 来搜索出包含特定关键字的日志条目。</p>
|
|||
|
<p>常见的 grep 命令示例:</p>
|
|||
|
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">shellCopy</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">code#</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">在文件中搜索特定文本</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">grep</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">'text'</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/path/to/file</span></span>
|
|||
|
<span data-line> </span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-comment);"># 在文件中搜索,忽略大小写</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">grep</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-i</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">'text'</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/path/to/file</span></span>
|
|||
|
<span data-line> </span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-comment);"># 递归搜索目录中的所有文件</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">grep</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-r</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">'text'</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/path/to/dir</span></span>
|
|||
|
<span data-line> </span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-comment);"># 显示匹配文本的行数</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">grep</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-c</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">'text'</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/path/to/file</span></span>
|
|||
|
<span data-line> </span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-comment);"># 显示匹配和不匹配的行</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">grep</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-v</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">'text'</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/path/to/file</span></span></code></pre></div>
|
|||
|
<h3 id="awk-文本分析工具"><code>Awk</code> 文本分析工具<a aria-hidden="true" tabindex="-1" href="#awk-文本分析工具" class="internal"> §</a></h3>
|
|||
|
<p><code>awk</code> 是一个功能强大的文本分析工具,主要用于生成报告和处理数据文件。它拥有强大的编程语言特性,可以处理复杂的任务。</p>
|
|||
|
<p>常见的 awk 命令示例:</p>
|
|||
|
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">shellCopy</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">code#</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">打印文件的第一列</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">awk</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">'{print $1}'</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/path/to/file</span></span>
|
|||
|
<span data-line> </span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-comment);"># 计算文件的第一列的和</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">awk</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">'{sum += $1} END {print sum}'</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/path/to/file</span></span>
|
|||
|
<span data-line> </span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-comment);"># 在文件中查找特定的文本</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">awk</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">'/text/ {print $0}'</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/path/to/file</span></span>
|
|||
|
<span data-line> </span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-comment);"># 打印文件中的行数</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">awk</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">'END {print NR}'</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/path/to/file</span></span></code></pre></div>
|
|||
|
<h3 id="sed-文本处理工具"><code>Sed</code> 文本处理工具<a aria-hidden="true" tabindex="-1" href="#sed-文本处理工具" class="internal"> §</a></h3>
|
|||
|
<p><code>sed</code>(流编辑器)是 Unix 和类 Unix 系统中的一个非常强大的文本处理工具。主要用于文本替换,删除,插入和其他文本转换任务。</p>
|
|||
|
<p>常见的 sed 命令示例:</p>
|
|||
|
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">shellCopy</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">code#</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">在文件中替换文本</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">sed</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">'s/text/newtext/g'</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/path/to/file</span></span>
|
|||
|
<span data-line> </span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-comment);"># 在文件中删除行</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">sed</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">'5d'</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/path/to/file</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-comment);"># 删除第 5 行</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">sed</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">'/text/d'</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/path/to/file</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-comment);"># 删除包含 "text" 的行</span></span>
|
|||
|
<span data-line> </span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-comment);"># 插入文本</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">sed</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">'5i\text'</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/path/to/file</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-comment);"># 在第 5 行之前插入 "text"</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">sed</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">'5a\text'</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/path/to/file</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-comment);"># 在第 5 行之后插入 "text"</span></span></code></pre></div>
|
|||
|
<h3 id="head-查看文件头部内容"><code>Head</code> 查看文件头部内容<a aria-hidden="true" tabindex="-1" href="#head-查看文件头部内容" class="internal"> §</a></h3>
|
|||
|
<p><code>head</code> 命令在 Unix-like 系统中用于输出文件的头部内容。它主要用于快速查看文件的开始部分,对于检查日志文件、文本文件等的开头信息非常有用。</p>
|
|||
|
<p>常用的 head 命令示例:</p>
|
|||
|
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);"># 默认查看文件的前 10 行</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">head</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/path/to/file</span></span>
|
|||
|
<span data-line> </span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-comment);"># 查看文件的前 20 行</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">head</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-n</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-constant);">20</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/path/to/file</span></span></code></pre></div>
|
|||
|
<h3 id="tail-查看文件尾部内容"><code>Tail</code> 查看文件尾部内容<a aria-hidden="true" tabindex="-1" href="#tail-查看文件尾部内容" class="internal"> §</a></h3>
|
|||
|
<p><code>tail</code> 命令在 Unix-like 系统中用于输出文件的尾部内容。它主要用于实时查看和监控日志文件的变化。</p>
|
|||
|
<p>常用的 tail 命令示例:</p>
|
|||
|
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);"># 默认查看文件的最后 10 行</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">tail</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/path/to/log</span></span>
|
|||
|
<span data-line> </span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-comment);"># 查看文件的最后 20 行</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">tail</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-n</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-constant);">20</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/path/to/log</span></span>
|
|||
|
<span data-line> </span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-comment);"># 实时查看文件的变化</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">tail</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-f</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/path/to/log</span></span></code></pre></div>
|
|||
|
<h3 id="less-查看文件内容"><code>Less</code> 查看文件内容<a aria-hidden="true" tabindex="-1" href="#less-查看文件内容" class="internal"> §</a></h3>
|
|||
|
<p><code>less</code> 是一个在 Unix-like 系统中用于查看文件内容的命令。相比于其他查看器,如 <code>more</code>,<code>less</code> 提供了更多的功能和灵活性。</p>
|
|||
|
<p>Less 命令的一个重要特性是它允许用户向前和向后滚动查看文件。在 <code>less</code> 中,你可以使用 <code>Page Up</code> 和 <code>Page Down</code> 键来滚动查看文件,使用 <code>/</code> 来搜索文本,使用 <code>n</code> 和 <code>N</code> 来查找下一个和上一个匹配的文本。</p>
|
|||
|
<p>在 less 中,你可以使用 <code>Shift + F</code> 来实时查看文件的变化,按 <code>Ctrl + C</code> 停止实时查看。</p>
|
|||
|
<p>以下是一些常用的 less 命令示例:</p>
|
|||
|
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);"># 查看文件</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">less</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/path/to/log</span></span>
|
|||
|
<span data-line> </span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-comment);"># 在文件中搜索文本</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">less</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/path/to/log</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">/keyword</span></span>
|
|||
|
<span data-line> </span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-comment);"># 实时查看文件的变化</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">less</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">+F</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/path/to/log</span></span></code></pre></div>
|
|||
|
<h2 id="高级日志处理">高级日志处理<a aria-hidden="true" tabindex="-1" href="#高级日志处理" class="internal"> §</a></h2>
|
|||
|
<p>日志处理是 Linux 系统管理的重要部分,用于监控系统行为,诊断问题,以及安全审计。高级日志处理涉及到日志服务器的配置使用,以及日志分析框架的应用。</p>
|
|||
|
<h3 id="日志服务器">日志服务器<a aria-hidden="true" tabindex="-1" href="#日志服务器" class="internal"> §</a></h3>
|
|||
|
<p><code>rsyslog</code> 和 <code>syslog-ng</code> 是两种广泛使用的日志服务器,这两种服务器都可以接收、处理和转发日志信息。</p>
|
|||
|
<h4 id="rsyslog">Rsyslog<a aria-hidden="true" tabindex="-1" href="#rsyslog" class="internal"> §</a></h4>
|
|||
|
<p><code>rsyslog</code> 是一个多线程的日志处理系统,提供了高性能、安全性、模块化和可配置性。<code>rsyslog</code> 的配置文件通常位于 <code>/etc/rsyslog.conf</code>,你可以在这个文件中定义日志的收集方式、存储位置以及转发规则等。</p>
|
|||
|
<p>例如,如果你想配置 <code>rsyslog</code> 来接收远程日志,你需要在 <code>/etc/rsyslog.conf</code> 文件中添加以下行:</p>
|
|||
|
<pre><code>module(load="imudp")
|
|||
|
input(type="imudp" port="514")
|
|||
|
</code></pre>
|
|||
|
<p>这将配置 <code>rsyslog</code> 来监听 UDP 端口 514,并接收该端口上的日志消息。</p>
|
|||
|
<h4 id="syslog-ng">Syslog-ng<a aria-hidden="true" tabindex="-1" href="#syslog-ng" class="internal"> §</a></h4>
|
|||
|
<p><code>syslog-ng</code> 是另一个强大的日志管理解决方案,它提供了更多的灵活性和功能,包括内容过滤、丰富的日志转换能力以及对各种日志格式的支持。<code>syslog-ng</code> 的配置文件通常位于 <code>/etc/syslog-ng/syslog-ng.conf</code>。</p>
|
|||
|
<p>例如,你可以在 <code>syslog-ng</code> 的配置文件中添加以下行,以接收远程日志:</p>
|
|||
|
<pre><code>source s_net { udp(ip(0.0.0.0) port(514)); };
|
|||
|
log { source(s_net); destination(d_local); };
|
|||
|
</code></pre>
|
|||
|
<p>这将配置 <code>syslog-ng</code> 来监听 UDP 端口 514,并将接收到的日志消息转发到本地的日志目的地 <code>d_local</code>。</p>
|
|||
|
<h4 id="集中日志管理的实践">集中日志管理的实践<a aria-hidden="true" tabindex="-1" href="#集中日志管理的实践" class="internal"> §</a></h4>
|
|||
|
<p>集中日志管理是指通过网络将所有服务器的日志集中到一个地方进行存储和分析。这样可以提高日志分析的效率,也可以提高数据安全性,因为日志信息不再分散在各个服务器上。</p>
|
|||
|
<p>在 <code>rsyslog</code> 或 <code>syslog-ng</code> 中,你可以配置日志转发规则,将日志信息发送到日志服务器上。例如,在 <code>rsyslog</code> 中,你可以在 <code>/etc/rsyslog.conf</code> 文件中添加以下行,以将所有日志消息转发到远程服务器:</p>
|
|||
|
<pre><code>*.* @remote-host:514
|
|||
|
</code></pre>
|
|||
|
<p>在这个例子中,<code>*.*</code> 表示所有的设施和优先级,<code>@</code> 表示使用 UDP 协议,<code>remote-host</code> 是远程服务器的主机名或 IP 地址,<code>514</code> 是远程服务器上 <code>rsyslog</code> 服务的端口号。</p>
|
|||
|
<p>在日志服务器上,你需要配置相应的服务,以接收和存储这些日志信息。此外,你还需要配置日志轮转,以防止日志文件占用过多的磁盘空间。你可以使用 <code>logrotate</code> 工具来配置日志轮转,例如,你可以在 <code>/etc/logrotate.conf</code> 文件中添加以下配置:</p>
|
|||
|
<pre><code>/var/log/syslog
|
|||
|
{
|
|||
|
rotate 7
|
|||
|
daily
|
|||
|
compress
|
|||
|
postrotate
|
|||
|
/usr/bin/killall -HUP syslogd
|
|||
|
endscript
|
|||
|
}
|
|||
|
</code></pre>
|
|||
|
<p>这个配置将每天轮转 <code>/var/log/syslog</code> 文件,保留 7 天的日志,将旧的日志文件压缩,轮转后发送 HUP 信号给 <code>syslogd</code> 进程,让它重新打开日志文件。</p>
|
|||
|
<h3 id="日志分析框架">日志分析框架<a aria-hidden="true" tabindex="-1" href="#日志分析框架" class="internal"> §</a></h3>
|
|||
|
<p>日志分析框架是用于处理和分析大量日志数据的工具,其中最常用的是 ELK 栈。</p>
|
|||
|
<h4 id="elk-栈elasticsearch-logstash-kibana的安装和配置">ELK 栈(Elasticsearch, Logstash, Kibana)的安装和配置<a aria-hidden="true" tabindex="-1" href="#elk-栈elasticsearch-logstash-kibana的安装和配置" class="internal"> §</a></h4>
|
|||
|
<p>ELK 栈是 Elasticsearch、Logstash 和 Kibana 的组合,它们一起提供了一个强大的日志分析框架。</p>
|
|||
|
<ul>
|
|||
|
<li>Elasticsearch 是一个基于 Lucene 的搜索和分析引擎,用于存储、搜索和分析大量的日志数据。</li>
|
|||
|
<li>Logstash 是一个强大的日志收集、处理和转发工具,它可以将日志数据从各种来源收集过来,然后进行处理,并将其发送到 Elasticsearch 或其他存储系统中。</li>
|
|||
|
<li>Kibana 是一个用于可视化 Elasticsearch 数据的 Web 界面,你可以通过 Kibana 创建各种图表和仪表板,以直观地展示和分析日志数据。</li>
|
|||
|
</ul>
|
|||
|
<p>安装和配置 ELK 栈需要多个步骤,包括安装 Java 环境,下载和安装 Elasticsearch、Logstash 和 Kibana,以及配置它们的通信和安全性等。</p>
|
|||
|
<h4 id="使用案例和最佳实践">使用案例和最佳实践<a aria-hidden="true" tabindex="-1" href="#使用案例和最佳实践" class="internal"> §</a></h4>
|
|||
|
<p>使用 ELK 栈进行日志分析的案例有很多,例如,你可以使用它来分析 Web 服务器的访问日志,从而了解网站的访问量、访问者的地理位置、访问的高峰时段等信息。</p>
|
|||
|
<p>或者,你也可以使用 ELK 栈来分析系统日志,以监控系统的运行状态,识别和预防可能的问题。</p>
|
|||
|
<p>在使用 ELK 栈时,有一些最佳实践可以参考,例如:</p>
|
|||
|
<ul>
|
|||
|
<li>使用 Logstash 的过滤插件来清洗和转换日志数据,以提高 Elasticsearch 的搜索和分析效率。</li>
|
|||
|
<li>使用 Kibana 的仪表板功能来创建实时的系统监控界面。</li>
|
|||
|
<li>为 Elasticsearch 配置适当的索引策略,以提高搜索效率并降低存储成本。</li>
|
|||
|
<li>定期备份 Elasticsearch 的数据,以防止数据丢失。</li>
|
|||
|
</ul>
|
|||
|
<h2 id="故障排除实践">故障排除实践<a aria-hidden="true" tabindex="-1" href="#故障排除实践" class="internal"> §</a></h2>
|
|||
|
<h3 id="日志排错流程和方法">日志排错流程和方法<a aria-hidden="true" tabindex="-1" href="#日志排错流程和方法" class="internal"> §</a></h3>
|
|||
|
<p>故障排除的第一步是查看相关日志,因为日志通常包含有关故障的关键信息。以下是一般的日志排错流程和方法:</p>
|
|||
|
<ol>
|
|||
|
<li>
|
|||
|
<p><strong>确定故障现象</strong>:首先,要明确故障的具体表现和现象,例如服务无法启动、网络连接失败等。</p>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p><strong>查看系统日志</strong>:检查系统的核心日志文件,如 <code>/var/log/syslog</code>、<code>/var/log/messages</code>,以及应用程序的日志文件。查找与故障相关的错误消息、警告或异常。</p>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p><strong>分析日志内容</strong>:仔细阅读日志文件,查找关键字、错误代码或异常信息。注意日志文件中的时间戳,以确定故障发生的时间点。</p>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p><strong>比对正常日志</strong>:如果可能的话,对比故障发生之前的正常日志和故障发生时的异常日志,以找出变化和异常之处。</p>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p><strong>查找解决方案</strong>:根据日志中的错误消息或异常信息,使用搜索引擎、官方文档或社区论坛等资源,查找可能的解决方案。</p>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p><strong>尝试修复故障</strong>:根据找到的解决方案,尝试修复故障。在进行任何更改之前,确保备份相关文件和配置。</p>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p><strong>验证修复效果</strong>:修复故障后,验证系统是否恢复正常。检查相关服务的状态、功能和性能。</p>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p><strong>记录故障和解决方案</strong>:将故障和解决方案记录下来,以便将来参考。这对于建立故障知识库和提高故障排除效率非常有帮助。</p>
|
|||
|
</li>
|
|||
|
</ol>
|
|||
|
<h3 id="常见故障案例">常见故障案例<a aria-hidden="true" tabindex="-1" href="#常见故障案例" class="internal"> §</a></h3>
|
|||
|
<h4 id="服务启动失败">服务启动失败<a aria-hidden="true" tabindex="-1" href="#服务启动失败" class="internal"> §</a></h4>
|
|||
|
<p>故障现象:某个服务无法启动,无法提供正常的功能和服务。</p>
|
|||
|
<p>排除方法:</p>
|
|||
|
<ul>
|
|||
|
<li>检查服务的日志文件,查找与启动失败相关的错误消息或异常信息。</li>
|
|||
|
<li>确保服务的依赖项已安装并正确配置。</li>
|
|||
|
<li>检查服务的配置文件,确保没有语法错误或配置问题。</li>
|
|||
|
<li>检查服务的权限设置,确保对必要的文件和目录具有适当的权限。</li>
|
|||
|
<li>尝试手动启动服务,并观察是否有错误消息或异常输出。</li>
|
|||
|
</ul>
|
|||
|
<p>解决方案:</p>
|
|||
|
<ul>
|
|||
|
<li>根据日志文件中的错误消息或异常信息,查找解决方案。</li>
|
|||
|
<li>检查系统和服务的文档、社区论坛或官方支持渠道,寻求帮助和建议。</li>
|
|||
|
<li>如果问题仍然存在,尝试重新安装服务或使用备份恢复系统。</li>
|
|||
|
</ul>
|
|||
|
<h4 id="网络问题">网络问题<a aria-hidden="true" tabindex="-1" href="#网络问题" class="internal"> §</a></h4>
|
|||
|
<p>故障现象:服务器无法与其他设备或互联网建立连接,网络服务不可用。</p>
|
|||
|
<p>排除方法:</p>
|
|||
|
<ul>
|
|||
|
<li>检查网络接口的状态和配置,确保网络接口已启用并正确配置。</li>
|
|||
|
<li>使用 <code>ping</code> 命令检查与其他设备的连通性。</li>
|
|||
|
<li>检查网络设备(如路由器、交换机)的状态和配置,确保网络设备正常工作。</li>
|
|||
|
<li>检查防火墙规则和安全组配置,确保允许必要的网络流量通过。</li>
|
|||
|
</ul>
|
|||
|
<p>解决方案:</p>
|
|||
|
<ul>
|
|||
|
<li>根据网络设备的日志和错误消息,查找解决方案。</li>
|
|||
|
<li>检查网络设备的文档、社区论坛或官方支持渠道,寻求帮助和建议。</li>
|
|||
|
<li>如果问题仍然存在,尝试重新配置网络设备或与网络管理员协商解决。</li>
|
|||
|
</ul>
|
|||
|
<h4 id="安全和权限问题">安全和权限问题<a aria-hidden="true" tabindex="-1" href="#安全和权限问题" class="internal"> §</a></h4>
|
|||
|
<p>故障现象:访问被拒绝,无法执行某些操作,权限不足等安全或权限相关的问题。</p>
|
|||
|
<p>排除方法:</p>
|
|||
|
<ul>
|
|||
|
<li>检查访问被拒绝的错误消息和日志,查找与权限相关的信息。</li>
|
|||
|
<li>确保使用正确的身份验证凭据进行访问,检查用户名和密码是否正确。</li>
|
|||
|
<li>检查文件和目录的权限设置,确保有足够的权限执行所需的操作。</li>
|
|||
|
<li>检查安全策略和访问控制列表(ACL),确保允许所需的访问权限。</li>
|
|||
|
</ul>
|
|||
|
<p>解决方案:</p>
|
|||
|
<ul>
|
|||
|
<li>根据错误消息和日志中的信息,查找解决方案。</li>
|
|||
|
<li>检查系统和应用程序的文档、安全指南或官方支持渠道,寻求帮助和建议。</li>
|
|||
|
<li>如果问题涉及到安全漏洞,及时更新系统、应用程序或补丁,以修复漏洞。</li>
|
|||
|
</ul>
|
|||
|
<h2 id="安全和审计日志">安全和审计日志<a aria-hidden="true" tabindex="-1" href="#安全和审计日志" class="internal"> §</a></h2>
|
|||
|
<p>安全和审计日志对于保护系统安全和识别潜在的安全威胁非常重要。</p>
|
|||
|
<p>安全日志监控是指对系统和应用程序的安全事件进行实时监控和记录,以便及时发现和应对潜在的安全威胁。以下是安全日志监控的重要性:</p>
|
|||
|
<ul>
|
|||
|
<li>
|
|||
|
<p><strong>威胁检测和响应</strong>:通过监控安全日志,可以及时检测到潜在的安全威胁,例如入侵尝试、异常登录、恶意代码等。及早发现威胁并采取相应的响应措施,可以减少损失和风险。</p>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p><strong>事件调查和取证</strong>:安全日志记录了系统和应用程序的关键事件,可以用于后续的事件调查和取证。当发生安全事件时,可以通过分析安全日志来了解事件的起因、影响和相关的活动。</p>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p><strong>合规性和法规要求</strong>:许多行业和组织需要遵守特定的合规性和法规要求,其中包括对安全日志的监控和记录。通过对安全日志进行监控,可以满足合规性要求,并提供给审核人员进行审计。</p>
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
<h3 id="使用-auditd-进行系统审计">使用 <code>auditd</code> 进行系统审计<a aria-hidden="true" tabindex="-1" href="#使用-auditd-进行系统审计" class="internal"> §</a></h3>
|
|||
|
<p><code>auditd</code> 是 Linux 系统中的一个审计框架,可以用于记录系统和应用程序的安全事件。它提供了强大的审计功能,可以配置和记录各种事件,如文件访问、用户登录、进程创建等。</p>
|
|||
|
<h4 id="审计日志的配置和分析">审计日志的配置和分析<a aria-hidden="true" tabindex="-1" href="#审计日志的配置和分析" class="internal"> §</a></h4>
|
|||
|
<p>要使用 <code>auditd</code> 进行系统审计,需要进行以下配置和分析步骤:</p>
|
|||
|
<ol>
|
|||
|
<li>
|
|||
|
<p><strong>安装和启动 <code>auditd</code></strong>:首先,需要安装 <code>auditd</code> 软件包,并启动 <code>auditd</code> 服务。具体的安装和启动方法取决于所使用的 Linux 发行版。</p>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p><strong>配置审计规则</strong>:通过编辑 <code>auditd</code> 的配置文件,可以定义需要审计的事件和规则。配置文件通常位于 <code>/etc/audit/auditd.conf</code> 或 <code>/etc/audit/rules.d/</code> 目录下。</p>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p><strong>启用审计规则</strong>:使用 <code>auditctl</code> 命令加载和启用审计规则。例如,可以使用以下命令启用一个规则来监控文件的访问:</p>
|
|||
|
<pre><code>auditctl -w /path/to/file -p rwxa
|
|||
|
</code></pre>
|
|||
|
<p>这将监控指定文件的读取、写入、执行和属性更改。</p>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p><strong>审计日志的分析</strong>:审计日志通常存储在 <code>/var/log/audit/audit.log</code> 文件中。可以使用工具如 <code>ausearch</code> 和 <code>aureport</code> 来分析和查询审计日志。下面将详细介绍这两个工具。</p>
|
|||
|
</li>
|
|||
|
</ol>
|
|||
|
<h4 id="ausearch-和-aureport-工具的使用"><code>ausearch</code> 和 <code>aureport</code> 工具的使用<a aria-hidden="true" tabindex="-1" href="#ausearch-和-aureport-工具的使用" class="internal"> §</a></h4>
|
|||
|
<p><code>ausearch</code> 和 <code>aureport</code> 是 <code>auditd</code> 提供的两个用于审计日志分析的工具。</p>
|
|||
|
<ul>
|
|||
|
<li>
|
|||
|
<p><strong><code>ausearch</code></strong>:<code>ausearch</code> 工具用于在审计日志中进行高级搜索和过滤。它可以根据时间、进程、文件、用户等条件来查询特定的审计事件。以下是一些常用的 <code>ausearch</code> 命令示例:</p>
|
|||
|
<ul>
|
|||
|
<li>
|
|||
|
<p>搜索特定时间范围内的事件:</p>
|
|||
|
<pre><code>ausearch -ts <start_time> -te <end_time>
|
|||
|
</code></pre>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p>搜索特定用户的事件:</p>
|
|||
|
<pre><code>ausearch -m USER_LOGIN -k <username>
|
|||
|
</code></pre>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p>搜索特定文件的事件:</p>
|
|||
|
<pre><code>ausearch -f /path/to/file
|
|||
|
</code></pre>
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p><strong><code>aureport</code></strong>:<code>aureport</code> 工具用于生成审计日志的报告和摘要信息。它可以提供关于审计事件的统计数据、趋势分析和可视化图表。以下是一些常用的 <code>aureport</code> 命令示例:</p>
|
|||
|
<ul>
|
|||
|
<li>
|
|||
|
<p>生成文件访问统计报告:</p>
|
|||
|
<pre><code>aureport -f
|
|||
|
</code></pre>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p>生成用户登录统计报告:</p>
|
|||
|
<pre><code>aureport -l
|
|||
|
</code></pre>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p>生成系统调用统计报告:</p>
|
|||
|
<pre><code>aureport -s
|
|||
|
</code></pre>
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
<p>通过使用 <code>ausearch</code> 和 <code>aureport</code> 工具,可以对审计日志进行深入的分析和查询,以便了解系统中发生的安全事件和活动。</p></article></div><div class="right sidebar"><div class="graph "><h3>Graph View</h3><div class="graph-outer"><div id="graph-container" data-cfg="{"drag":true,"zoom":true,"depth":1,"scale":1.1,"repelForce":0.5,"centerForce":0.3,"linkDistance":30,"fontSize":0.6,"opacityScale":1,"showTags":true,"removeTags":[]}"></div><svg version="1.1" id="global-graph-icon" xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 55 55" fill="currentColor" xmlSpace="preserve"><path d="M49,0c-3.309,0-6,2.691-6,6c0,1.035,0.263,2.009,0.726,2.86l-9.829,9.829C32.542,17.634,30.846,17,29,17
|
|||
|
s-3.542,0.634-4.898,1.688l-7.669-7.669C16.785,10.424,17,9.74,17,9c0-2.206-1.794-4-4-4S9,6.794,9,9s1.794,4,4,4
|
|||
|
c0.74,0,1.424-0.215,2.019-0.567l7.669,7.669C21.634,21.458,21,23.154,21,25s0.634,3.542,1.688,4.897L10.024,42.562
|
|||
|
C8.958,41.595,7.549,41,6,41c-3.309,0-6,2.691-6,6s2.691,6,6,6s6-2.691,6-6c0-1.035-0.263-2.009-0.726-2.86l12.829-12.829
|
|||
|
c1.106,0.86,2.44,1.436,3.898,1.619v10.16c-2.833,0.478-5,2.942-5,5.91c0,3.309,2.691,6,6,6s6-2.691,6-6c0-2.967-2.167-5.431-5-5.91
|
|||
|
v-10.16c1.458-0.183,2.792-0.759,3.898-1.619l7.669,7.669C41.215,39.576,41,40.26,41,41c0,2.206,1.794,4,4,4s4-1.794,4-4
|
|||
|
s-1.794-4-4-4c-0.74,0-1.424,0.215-2.019,0.567l-7.669-7.669C36.366,28.542,37,26.846,37,25s-0.634-3.542-1.688-4.897l9.665-9.665
|
|||
|
C46.042,11.405,47.451,12,49,12c3.309,0,6-2.691,6-6S52.309,0,49,0z M11,9c0-1.103,0.897-2,2-2s2,0.897,2,2s-0.897,2-2,2
|
|||
|
S11,10.103,11,9z M6,51c-2.206,0-4-1.794-4-4s1.794-4,4-4s4,1.794,4,4S8.206,51,6,51z M33,49c0,2.206-1.794,4-4,4s-4-1.794-4-4
|
|||
|
s1.794-4,4-4S33,46.794,33,49z M29,31c-3.309,0-6-2.691-6-6s2.691-6,6-6s6,2.691,6,6S32.309,31,29,31z M47,41c0,1.103-0.897,2-2,2
|
|||
|
s-2-0.897-2-2s0.897-2,2-2S47,39.897,47,41z M49,10c-2.206,0-4-1.794-4-4s1.794-4,4-4s4,1.794,4,4S51.206,10,49,10z"></path></svg></div><div id="global-graph-outer"><div id="global-graph-container" data-cfg="{"drag":true,"zoom":true,"depth":-1,"scale":0.9,"repelForce":0.5,"centerForce":0.3,"linkDistance":30,"fontSize":0.6,"opacityScale":1,"showTags":true,"removeTags":[]}"></div></div></div><div class="toc desktop-only"><button type="button" id="toc" class><h3>Table of Contents</h3><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="fold"><polyline points="6 9 12 15 18 9"></polyline></svg></button><div id="toc-content"><ul class="overflow"><li class="depth-0"><a href="#引言" data-for="引言">引言</a></li><li class="depth-0"><a href="#linux-日志系统" data-for="linux-日志系统">Linux 日志系统</a></li><li class="depth-1"><a href="#常见日志文件" data-for="常见日志文件">常见日志文件</a></li><li class="depth-0"><a href="#日志管理工具" data-for="日志管理工具">日志管理工具</a></li><li class="depth-1"><a href="#journalctl-日志管理" data-for="journalctl-日志管理">journalctl 日志管理</a></li><li class="depth-1"><a href="#logwatch-日志分析工具" data-for="logwatch-日志分析工具">Logwatch 日志分析工具</a></li><li class="depth-1"><a href="#logrotate-日志轮转" data-for="logrotate-日志轮转">logrotate 日志轮转</a></li><li class="depth-0"><a href="#日志分析技巧" data-for="日志分析技巧">日志分析技巧</a></li><li class="depth-1"><a href="#grep-文本搜索工具" data-for="grep-文本搜索工具">Grep 文本搜索工具</a></li><li class="depth-1"><a href="#awk-文本分析工具" data-for="awk-文本分析工具">Awk 文本分析工具</a></li><li class="depth-1"><a href="#sed-文本处理工具" data-for="sed-文本处理工具">Sed 文本处理工具</a></li><li class="depth-1"><a href="#head-查看文件头部内容" data-for="head-查看文件头部内容">Head 查看文件头部内容</a></li><li class="depth-1"><a href="#tail-查看文件尾部内容" data-for="tail-查看文件尾部内容">Tail 查看文件尾部内容</a></li><li class="depth-1"><a href="#less-查看文件内容" data-for="less-查看文件内容">Less 查看文件内容</a></li><li class="depth-0"><a href="#高级日志处理" data-for="高级日志处理">高级日志处理</a></li><li class="depth-1"><a href="#日志服务器" data-for="日志服务器">日志服务器</a></li><li class="depth-1"><a href="#日志分析框架" data-for="日志分析框架">日志分析框架</a></li><li class="depth-0"><a href="#故障排除实践" data-for="故障排除实践">故障排除实践</a></li><li class="depth-1"><a href="#日志排错流程和方法" data-for="日志排错流程和方法">日志排错流程和方法</a></li><li class="depth-1"><a href="#常见故障案例" data-for="常见故障案例">常见故障案例</a></li><li class="depth-0"><a href="#安全和审计日志" data-for="安全和审计日志">安全和审计日志</a></li><li class="depth-1"><a href="#使用-auditd-进行系统审计" data-for="使用-auditd-进行系统审计">使用 auditd 进行系统审计</a></li></ul></div></div><div class="backlinks "><h3>Backlinks</h3><ul class="overflow"><li>No backlinks found</li></ul></div><div class="explorer mobile-only"><button type="button" id="explorer" data-behavior="collapse" data-collapsed="collapsed" data-savestate="true" data-tree="[{"path":"Basics","collapsed":true},{"path":"Basics/english","collapsed":true},{"path":"Blog","collapsed":true},{"path":"Book","collapsed":true},{"path":"Book/个人成长","collapsed":true},{"path":"Book/<2F>
|
|||
|
function toggleCallout() {
|
|||
|
const outerBlock = this.parentElement;
|
|||
|
outerBlock.classList.toggle(`is-collapsed`);
|
|||
|
const collapsed = outerBlock.classList.contains(`is-collapsed`);
|
|||
|
const height = collapsed ? this.scrollHeight : outerBlock.scrollHeight;
|
|||
|
outerBlock.style.maxHeight = height + `px`;
|
|||
|
let current = outerBlock;
|
|||
|
let parent = outerBlock.parentElement;
|
|||
|
while (parent) {
|
|||
|
if (!parent.classList.contains(`callout`)) {
|
|||
|
return;
|
|||
|
}
|
|||
|
const collapsed2 = parent.classList.contains(`is-collapsed`);
|
|||
|
const height2 = collapsed2 ? parent.scrollHeight : parent.scrollHeight + current.scrollHeight;
|
|||
|
parent.style.maxHeight = height2 + `px`;
|
|||
|
current = parent;
|
|||
|
parent = parent.parentElement;
|
|||
|
}
|
|||
|
}
|
|||
|
function setupCallout() {
|
|||
|
const collapsible = document.getElementsByClassName(
|
|||
|
`callout is-collapsible`
|
|||
|
);
|
|||
|
for (const div of collapsible) {
|
|||
|
const title = div.firstElementChild;
|
|||
|
if (title) {
|
|||
|
title.removeEventListener(`click`, toggleCallout);
|
|||
|
title.addEventListener(`click`, toggleCallout);
|
|||
|
const collapsed = div.classList.contains(`is-collapsed`);
|
|||
|
const height = collapsed ? title.scrollHeight : div.scrollHeight;
|
|||
|
div.style.maxHeight = height + `px`;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
document.addEventListener(`nav`, setupCallout);
|
|||
|
window.addEventListener(`resize`, setupCallout);
|
|||
|
</script><script type="module">
|
|||
|
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.esm.min.mjs';
|
|||
|
const darkMode = document.documentElement.getAttribute('saved-theme') === 'dark'
|
|||
|
mermaid.initialize({
|
|||
|
startOnLoad: false,
|
|||
|
securityLevel: 'loose',
|
|||
|
theme: darkMode ? 'dark' : 'default'
|
|||
|
});
|
|||
|
document.addEventListener('nav', async () => {
|
|||
|
await mermaid.run({
|
|||
|
querySelector: '.mermaid'
|
|||
|
})
|
|||
|
});
|
|||
|
</script><script src="https://cdn.jsdelivr.net/npm/katex@0.16.7/dist/contrib/copy-tex.min.js" type="application/javascript"></script><script src="../../../../postscript.js" type="module"></script></html>
|