日志中有很多信息需要你去处理,虽然有时候提取起来并不容易。在本文中,我们将介绍一些您现在就可以进行的基本日志分析示例(只需搜索)。我们还将涉及一些更高级的分析,但这些需要前期努力才能正确设置,并且以后会为您节省很多时间。对数据进行高级分析的示例包括生成汇总计数、过滤有效值等。我们首先向您展示如何从命令行使用几种不同的工具,然后展示日志管理工具如何自动执行大部分繁重的工作以简化日志分析。使用Grepsearch搜索文本是最基本的信息查找方式。最常用的文本搜索工具是grep。这个命令行工具在大多数Linux发行版中都可用,它允许您使用正则表达式搜索日志。正则表达式是以识别匹配文本的特殊语言编写的模式。最简单的模式是用引号将要查找的字符串括起来。正则表达式这是一个在Ubuntu系统的身份验证日志中查找“userhoover”的示例:$grep"userhoover"/var/log/auth.logAcceptedpasswordforhooverfrom10.0.2.2port4792ssh2pam_unix(sshd:session):sessionopenedforuserhooverby(uid=0)pam_unix(sshd:session):sessionclosedforuserhoover构建一个精确的正则表达式可能很困难。例如,如果我们想搜索端口“4792”之类的数字,它可能还会匹配时间戳、URL和其他不需要的数据。在Ubuntu中的以下示例,它匹配我们不想要的Apache日志。$grep"4792"/var/log/auth.logAcceptedpasswordforhooverfrom10.0.2.2port4792ssh274.91.21.46--[31/??Mar/2015:19:44:32+0000]"GET/scripts/samples/search?q=4972HTTP/1.0"404545"-""-"环绕搜索另一个有用的小技巧是可以使用grep进行环绕搜索。这将向您显示匹配之前或之后的几行内容。它可以帮助您调试导致错误或问题的原因。选项B显示前几行,选项A显示接下来的几行。例如,我们知道,当一个人以管理员身份登录失败时,他的IP并没有被反转,这意味着他可能没有有效的域名。这非常可疑!$grep-B3-A2'无效用户'/var/log/auth.logApr2817:06:20ip-172-31-11-241sshd[12545]:反向映射检查216-19-2的getaddrinfo-8.commspeed.net[216.19.2.8]失败-可能的闯入尝试!4月28日17:06:20ip-172-31-11-241sshd[12545]:收到来自216.19.2.8的断开连接:11:再见再见[preauth]4月28日17:06:20ip-172-31-11-241sshd[12547]:无效的用户管理员来自216.19.2.8Apr2817:06:20ip-172-31-11-241sshd[12547]:input_userauth_request:invaliduseradmin[preauth]Apr2817:06:20ip-172-31-11-241sshd[12547]:Receiveddisconnectfrom216.19.2.8:11:ByeBye[preauth]Tail你也可以将grep与tail结合使用以获取文件的最后几行,或者跟踪日志并实时打印。这在您进行交互式更改时很有用,例如启动服务器或测试代码更改。$tail-f/var/log/auth.log|grep'Invaliduser'Apr3019:49:48ip-172-31-11-241sshd[6512]:来自219.140.64.136Apr3019:49:49ip-172-31-11-241sshd的无效用户ubnt[6514]:Invaliduseradminfrom219.140.64.136关于grep和正则表达式的详细介绍超出了本指南的范围,但Ryan的教程有更深入的介绍。日志管理系统具有更高的性能和更强大的搜索能力。它们通常为数据编制索引并并行查询,因此您可以在几秒钟内快速搜索GB或TB的日志。相比之下,grep需要几分钟,在极端情况下甚至可能需要数小时。日志管理系统还使用类似Lucene的查询语言,该语言提供更简单的语法来检索数字、字段等。使用Cut、AWK和Grok解析命令行工具Linux提供了几个用于文本解析和分析的命令行工具。当您想快速解析少量数据时很有用,但在处理大量数据时可能需要很长时间。Cutcut命令允许您解析分隔日志中的字段。分隔符是分隔字段或键值对的等号或逗号。假设我们想从下面的日志中解析出用户:pam_unix(su:auth):authenticationfailure;logname=hooveruid=1000euid=0tty=/dev/pts/0ruser=hooverrhost=user=root我们可以像下面这样使用cut命令得到第八个字段的文本,用等号分隔。这是Ubuntu系统上的示例:$grep"authenticationfailure"/var/log/auth.log|cut-d'='-f8roothooverrootnagiosnagiosAWK或者,您可以使用awk,它提供了更强大的解析字段。它提供了一种脚本语言,您可以在其中过滤掉几乎所有不相关的内容。例如,假设我们在Ubuntu系统中有以下日志行,我们想要提取失败登录的用户名:Mar2408:28:18ip-172-31-11-241sshd[32701]:input_userauth_request:invaliduserguest[preauth]您可以使用如下的awk命令。首先,使用正则表达式/sshd.*invaliduser/来匹配sshdinvaliduser行。然后使用{print$9}根据默认分隔符空格打印第九个字段。这将输出用户名。$awk'/sshd.*invaliduser/{print$9}'/var/log/auth.logguestadmininfotestubnt您可以在Awk用户指南中阅读有关如何使用正则表达式和输出字段的更多信息。#p#日志管理系统日志管理系统使解析更容易,使用户能够快速分析大量日志文件。它们自动解析标??准日志格式,例如常见的Linux日志和Web服务器日志。这样可以节省很多时间,因为在处理系统问题时不需要考虑自己编写解析逻辑。下面是sshd日志消息的示例,为每个remoteHost和用户解析出来。这是基于云的日志管理服务Loggly的屏幕截图。您还可以自定义非标准格式的解析。一个常用的工具是Grok,它使用一个通用的正则表达式库,可以将原始文本解析为结构化的JSON。下面是Grok在Logstash中解析内核日志文件的示例配置:}%{NOTSPACE}%{NUMBER:duration}%{NOTSPACE}%{GREEDYDATA:kernel_logs}"}}下图是Grok解析后的输出:FilteringwithRsyslogandAWKFilteringallowsyoutoretrieveaspecificfieldvaluewithoutNot全文搜索。这使您的日志分析更加准确,因为它忽略了来自日志信息其他部分的不需要的匹配项。为了搜索字段值,您首先需要解析日志或至少有一种检索事件结构的方法。如何过滤应用程序通常,您可能只想查看一个应用程序的日志。如果您的应用程序将所有记录保存到一个文件中,这很容易。如果您需要在聚合或集中日志中过滤应用程序,它会变得更加复杂。有几种方法可以做到这一点:使用rsyslog守护进程解析和过滤日志。以下示例将sshd应用程序的日志写入名为sshd-message的文件,然后丢弃该事件,这样它就不会在其他地方重复。您可以通过将此示例添加到您的rsyslog.conf文件来测试它。:programname,isequal,“sshd”/var/log/sshd-messages&~使用类似awk的命令行工具提取特定字段的值,例如sshd用户名。下面是Ubuntu系统上的示例。$awk'/sshd.*invaliduser/{print$9}'/var/log/auth.logguestadmininfotestubnt使用日志管理系统自动解析日志,然后在需要的应用名上点击过滤。下面是在Loggly日志管理服务中获取系统日志字段的屏幕截图。我们过滤应用程序名称“sshd”,如维恩图图标所示。如何过滤错误人们最希望在日志中看到错误。不幸的是,默认的syslog配置不会直接输出错误的严重性,因此很难过滤它们。这里有两个解决这个问题的方法。首先,您可以修改rsyslog配置以在日志文件中输出错误严重性,使它们易于查看和检索。在您的rsyslog配置中,您可以添加一个带有pri-text的模板,如下所示:“<%pri-text%>:%timegenerated%,%HOSTNAME%,%syslogtag%,%msg%n”此示例将遵循以下输出格式。您可以看到err指示此消息中的错误。
