天天看点

如何分析 Linux 日志

如何分析 Linux 日志

日志中有大量的信息需要你处理,尽管有时候想要提取并非想象中的容易。在这篇文章中我们会介绍一些你现在就能做的基本日志分析例子(只需要搜索即可)。我们还将涉及一些更高级的分析,但这些需要你前期努力做出适当的设置,后期就能节省很多时间。对数据进行高级分析的例子包括生成汇总计数、对有效值进行过滤,等等。

我们首先会向你展示如何在命令行中使用多个不同的工具,然后展示了一个日志管理工具如何能自动完成大部分繁重工作从而使得日志分析变得简单。

<a target="_blank"></a>

这是一个在 ubuntu 系统的认证日志中查找 “user hoover” 的例子:

<code>$ grep "user hoover" /var/log/auth.log</code>

<code>accepted password for hoover from 10.0.2.2 port 4792 ssh2</code>

<code>pam_unix(sshd:session): session opened for user hoover by (uid=0)</code>

<code>pam_unix(sshd:session): session closed for user hoover</code>

构建精确的正则表达式可能很难。例如,如果我们想要搜索一个类似端口 “4792” 的数字,它可能也会匹配时间戳、url 以及其它不需要的数据。ubuntu 中下面的例子,它匹配了一个我们不想要的 apache 日志。

<code>$ grep "4792" /var/log/auth.log</code>

<code>74.91.21.46 - - [31/mar/2015:19:44:32 +0000] "get /scripts/samples/search?q=4972 http/1.0" 404 545 "-" "-”</code>

另一个有用的小技巧是你可以用 grep 做环绕搜索。这会向你展示一个匹配前面或后面几行是什么。它能帮助你调试导致错误或问题的东西。<code>b</code> 选项展示前面几行,<code>a</code> 选项展示后面几行。举个例子,我们知道当一个人以管理员员身份登录失败时,同时他们的 ip 也没有反向解析,也就意味着他们可能没有有效的域名。这非常可疑!

<code>$ grep -b 3 -a 2 'invalid user' /var/log/auth.log</code>

<code>apr 28 17:06:20 ip-172-31-11-241 sshd[12545]: reverse mapping checking getaddrinfo for 216-19-2-8.commspeed.net [216.19.2.8] failed - possible break-in attempt!</code>

<code>apr 28 17:06:20 ip-172-31-11-241 sshd[12545]: received disconnect from 216.19.2.8: 11: bye bye [preauth]</code>

<code>apr 28 17:06:20 ip-172-31-11-241 sshd[12547]: invalid user admin from 216.19.2.8</code>

<code>apr 28 17:06:20 ip-172-31-11-241 sshd[12547]: input_userauth_request: invalid user admin [preauth]</code>

<code>apr 28 17:06:20 ip-172-31-11-241 sshd[12547]: received disconnect from 216.19.2.8: 11: bye bye [preauth]</code>

<code>$ tail -f /var/log/auth.log | grep 'invalid user'</code>

<code>apr 30 19:49:48 ip-172-31-11-241 sshd[6512]: invalid user ubnt from 219.140.64.136</code>

<code>apr 30 19:49:49 ip-172-31-11-241 sshd[6514]: invalid user admin from 219.140.64.136</code>

linux 提供了多个命令行工具用于文本解析和分析。当你想要快速解析少量数据时非常有用,但处理大量数据时可能需要很长时间。

假设我们想从下面的日志中解析出用户:

<code>pam_unix(su:auth): authentication failure; logname=hoover uid=1000 euid=0 tty=/dev/pts/0 ruser=hoover rhost= user=root</code>

我们可以像下面这样用 cut 命令获取用等号分割后的第八个字段的文本。这是一个 ubuntu 系统上的例子:

<code>$ grep "authentication failure" /var/log/auth.log | cut -d '=' -f 8</code>

<code>root</code>

<code>hoover</code>

<code>nagios</code>

例如,假设在 ubuntu 系统中我们有下面的一行日志,我们想要提取登录失败的用户名称:

<code>mar 24 08:28:18 ip-172-31-11-241 sshd[32701]: input_userauth_request: invalid user guest [preauth]</code>

你可以像下面这样使用 awk 命令。首先,用一个正则表达式 /sshd.*invalid user/ 来匹配 sshd invalid user 行。然后用 { print $9 } 根据默认的分隔符空格打印第九个字段。这样就输出了用户名。

<code>$ awk '/sshd.*invalid user/ { print $9 }' /var/log/auth.log</code>

<code>guest</code>

<code>admin</code>

<code>info</code>

<code>test</code>

<code>ubnt</code>

日志管理系统使得解析变得更加简单,使用户能快速的分析很多的日志文件。他们能自动解析标准的日志格式,比如常见的 linux 日志和 web 服务器日志。这能节省很多时间,因为当处理系统问题的时候你不需要考虑自己写解析逻辑。

下面是一个 sshd 日志消息的例子,解析出了每个 remotehost 和 user。这是 loggly 中的一张截图,它是一个基于云的日志管理服务。

如何分析 Linux 日志

<code>filter{</code>

<code>grok {</code>

<code>match =&gt; {"message" =&gt; "%{ciscotimestamp:timestamp} %{host:host} %{word:program}%{notspace} %{notspace}%{number:duration}%{notspace} %{greedydata:kernel_logs}"</code>

<code>}</code>

下图是 grok 解析后输出的结果:

如何分析 Linux 日志

过滤使得你能检索一个特定的字段值而不是进行全文检索。这使你的日志分析更加准确,因为它会忽略来自其它部分日志信息不需要的匹配。为了对一个字段值进行搜索,你首先需要解析日志或者至少有对事件结构进行检索的方式。

通常,你可能只想看一个应用的日志。如果你的应用把记录都保存到一个文件中就会很容易。如果你需要在一个聚集或集中式日志中过滤一个应用就会比较复杂。下面有几种方法来实现:

用 rsyslog 守护进程解析和过滤日志。下面的例子将 sshd 应用的日志写入一个名为 sshd-message 的文件,然后丢弃事件以便它不会在其它地方重复出现。你可以将它添加到你的 rsyslog.conf 文件中测试这个例子。

<code>:programname, isequal, “sshd” /var/log/sshd-messages</code>

<code>&amp;~</code>

用类似 awk 的命令行工具提取特定字段的值,例如 sshd 用户名。下面是 ubuntu 系统中的一个例子。

用日志管理系统自动解析日志,然后在需要的应用名称上点击过滤。下面是在 loggly 日志管理服务中提取 syslog 域的截图。我们对应用名称 “sshd” 进行过滤,如维恩图图标所示。

如何分析 Linux 日志

一个人最希望看到日志中的错误。不幸的是,默认的 syslog 配置不直接输出错误的严重性,也就使得难以过滤它们。

<code>"&lt;%pri-text%&gt; : %timegenerated%,%hostname%,%syslogtag%,%msg%n"</code>

这个例子会按照下面的格式输出。你可以看到该信息中指示错误的 err。

<code>&lt;authpriv.err&gt; : mar 11 18:18:00,hoover-virtualbox,su[5026]:, pam_authenticate: authentication failure</code>

你可以用 awk 或者 grep 检索错误信息。在 ubuntu 中,对这个例子,我们可以用一些语法特征,例如 . 和 &gt;,它们只会匹配这个域。

<code>$ grep '.err&gt;' /var/log/auth.log</code>

你的第二个选择是使用日志管理系统。好的日志管理系统能自动解析 syslog 消息并抽取错误域。它们也允许你用简单的点击过滤日志消息中的特定错误。

下面是 loggly 中一个截图,显示了高亮错误严重性的 syslog 域,表示我们正在过滤错误:

如何分析 Linux 日志

<b>原文发布时间为:2015-08-03</b>

<b></b>

<b>本文来自云栖社区合作伙伴“linux中国</b>

继续阅读