如何分析 Linux 日志


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

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

用 Grep 搜索

搜索文本是查找信息最基本的方式。搜索文本最常用的工具是 grep。这个命令行工具在大部分 Linux 发行版中都有,它允许你用正则表达式搜索日志。正则表达式是一种用特殊的语言写的、能识别匹配文本的模式。最简单的模式就是用引号把你想要查找的字符串括起来。

grep使用简明及正则表达式 

Linux下Shell编程——grep命令的基本运用

grep 命令详解及相关事例

Linux基础命令之grep详解

设置grep高亮显示匹配项

Linux grep命令学习与总结

14 个 grep 命令的例子

正则表达式

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

  1. $ grep "user hoover"/var/log/auth.log
  2. Accepted password for hoover from10.0.2.2 port 4792 ssh2
  3. pam_unix(sshd:session): session opened for user hoover by(uid=0)
  4. pam_unix(sshd:session): session closed for user hoover

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

  1. $ grep "4792"/var/log/auth.log
  2. Accepted password for hoover from10.0.2.2 port 4792 ssh2
  3. 74.91.21.46--[31/Mar/2015:19:44:32+0000]"GET /scripts/samples/search?q=4972 HTTP/1.0"404545"-""-”

环绕搜索

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

  1. $ grep -B 3-A 2'Invalid user'/var/log/auth.log
  2. Apr2817:06:20 ip-172-31-11-241 sshd[12545]: reverse mapping checking getaddrinfo for216-19-2-8.commspeed.net [216.19.2.8] failed - POSSIBLE BREAK-IN ATTEMPT!
  3. Apr2817:06:20 ip-172-31-11-241 sshd[12545]:Received disconnect from216.19.2.8:11:ByeBye[preauth]
  4. Apr2817:06:20 ip-172-31-11-241 sshd[12547]:Invalid user admin from216.19.2.8
  5. Apr2817:06:20 ip-172-31-11-241 sshd[12547]: input_userauth_request: invalid user admin [preauth]
  6. Apr2817:06:20 ip-172-31-11-241 sshd[12547]:Received disconnect from216.19.2.8:11:ByeBye[preauth]

Tail

你也可以把 grep 和 tail 结合使用来获取一个文件的最后几行,或者跟踪日志并实时打印。这在你做交互式更改的时候非常有用,例如启动服务器或者测试代码更改。

  1. $ tail -f /var/log/auth.log | grep 'Invalid user'
  2. Apr3019:49:48 ip-172-31-11-241 sshd[6512]:Invalid user ubnt from219.140.64.136
  3. Apr3019:49:49 ip-172-31-11-241 sshd[6514]:Invalid user admin from219.140.64.136

关于 grep 和正则表达式的详细介绍并不在本指南的范围,但 Ryan’s Tutorials 有更深入的介绍。

日志管理系统有更高的性能和更强大的搜索能力。它们通常会索引数据并进行并行查询,因此你可以很快的在几秒内就能搜索 GB 或 TB 的日志。相比之下,grep 就需要几分钟,在极端情况下可能甚至几小时。日志管理系统也使用类似 Lucene 的查询语言,它提供更简单的语法来检索数字、域以及其它。

用 Cut、 AWK、 和 Grok 解析

命令行工具

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

Cut

cut 命令允许你从有分隔符的日志解析字段。分隔符是指能分开字段或键值对的等号或逗号等。

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

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

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

  1. $ grep "authentication failure"/var/log/auth.log | cut -d '='-f 8
  2. root
  3. hoover
  4. root
  5. nagios
  6. nagios

AWK

另外,你也可以使用 awk,它能提供更强大的解析字段功能。它提供了一个脚本语言,你可以过滤出几乎任何不相干的东西。

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

  1. Mar2408:28:18 ip-172-31-11-241 sshd[32701]: input_userauth_request: invalid user guest [preauth]

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

  1. $ awk '/sshd.*invalid user/ { print $9 }'/var/log/auth.log
  2. guest
  3. admin
  4. info
  5. test
  6. ubnt

你可以在 Awk 用户指南 中阅读更多关于如何使用正则表达式和输出字段的信息。

AWK简介及使用实例

AWK 简介和例子

Shell脚本之AWK文本编辑器语法

正则表达式中AWK的学习和使用

文本数据处理之AWK 图解

如何在Linux中使用awk命令

文本分析工具-awk 

日志管理系统

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

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

你也可以对非标准格式自定义解析。一个常用的工具是 Grok,它用一个常见正则表达式库,可以解析原始文本为结构化 JSON。下面是一个 Grok 在 Logstash 中解析内核日志文件的事例配置:

  1. filter{
  2. grok {
  3. match =>{"message"=>"%{CISCOTIMESTAMP:timestamp} %{HOST:host} %{WORD:program}%{NOTSPACE} %{NOTSPACE}%{NUMBER:duration}%{NOTSPACE} %{GREEDYDATA:kernel_logs}"
  4. }
  5. }

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

更多详情见请继续阅读下一页的精彩内容:

  • 1
  • 2
  • 下一页

相关内容