什么是解析日志文件的最佳工具?

16

我使用grep来解析我的交易应用程序日志,但它的局限性在于我需要通过视觉检索输出来查看发生了什么等信息。

我想知道Perl是否是更好的选择?有没有好的资源可以学习Perl中的日志和字符串解析?

我也相信Python在这方面会是不错的选择。Perl vs Python vs“在Linux上使用grep”?


感谢大家的回复。我认为实际上我必须坚持使用Perl或Grep。在生产环境中,获取运行Python/Ruby等程序的权限本身就会成为一个项目。我想现在是时候提升我的正则表达式知识,在grep中完成任务了。 - user242591
2
@coderzambesi:请说明“最佳”和“更好”与什么相比?是更便宜吗?更快?更好的GUI开发工具?更多的供应商支持?你所说的“最佳”是什么意思? - S.Lott
9个回答

11

最终,这取决于你想要识别多少语义,你的日志是否符合常见模式,以及你想要对解析出的数据做什么。

如果你可以使用正则表达式找到所需内容,那么你有很多选择。Perl是一种流行的语言,具有非常方便的本地RE功能。我个人更喜欢Python,并发现针对RE进行简单操作的额外麻烦并不显著。

如果你想要做比RE匹配更智能的事情,或者想要有很多逻辑,你可能更喜欢Python甚至是Java / C++ /等等。例如,在Python中逐行读取然后应用各种谓词函数和反应匹配非常容易,这对于你想要应用规则集时非常好。


4

所有的脚本语言都是很好的选择:Perl、Python、Ruby、PHP和AWK都可以胜任此项工作。使用其中任何一种语言都比从(小)规模开始查看日志更好。

穿着红宝石拖鞋上班是一个用Ruby完成的示例,采用Why独特的风格编写。这里有一个Perl的基本示例。我建议您选择其中一种语言并开始动手。


2
Perl相对于Python的一个巨大优势在于,在解析文本时可以直接将正则表达式作为语言语法的一部分使用。例如:
if ($line =~ m/^Regex/) {
    ... code goes here
}

Perl还可以直接将捕获组分配给$1、$2等,使得它非常容易使用。根据您尝试解析的日志文件的格式和结构,这可能会非常有用(或者如果它可以被解析为固定宽度文件或使用更简单的技术,则不是很有用)。
这只是一些语法糖,其他语言也允许您使用正则表达式和捕获组(实际上,链接的文章展示了如何在Python中做到这一点)。你只需要写更多的代码并传递对象来完成它。

1
在编程方面,使用Perl的正则表达式能力并不比Python更具优势,因为首先,Python也有正则表达式,其次,正则表达式并不总是更好的解决方案。 - ghostdog74
1
在Perl中使用正则表达式仍然比其他语言简单,因为可以直接使用它们。是的,有时正则表达式不是正确的解决方案,这就是我说“取决于您尝试解析的日志文件的格式和结构”的原因。 - Adam Luchjenbroers
1
来吧,使用Python中的正则表达式并不难。如果你只是在争论纯粹的语法问题,那么你真的没有争论任何值得的东西。Perl有一些正则表达式功能,Python不支持,但大多数人不太可能需要它们。至于捕获缓冲区,Python在标记捕获方面领先(现在Perl也有了)。 - brian d foy

2

有一个名为Log_Analysis的Perl程序,可以为您进行大量分析和预处理。


2
学习一种编程语言将使你的日志分析能力提升到另一个水平。
任何动态或“脚本”语言,如Perl、Ruby或Python都可以胜任。你应该使用哪种语言取决于外部因素。以下是你应该考虑的几个因素:
  • 工作是否已经使用了适当的语言?
  • 你是否认识任何可以指导你使用适当语言的人?
  • 尝试每种语言一点,看看哪种语言更适合你。
就我个人而言,对于上述任务,我会使用Perl。你的情况可能不同。
喜欢Perl的几个原因:
强大的单行命令 - 如果你需要快速完成一项任务,Perl提供了一些真正好用的快捷方式。参见perlrun -n以获取一个例子。
多范式语言 - Perl支持命令式、函数式和面向对象的编程方法。
符号标记 - 变量前面的那些领先标点符号,如$foo或@bar。它们有点像匈牙利标记,但不会那么烦人。
驼鹿(Moose)——一种令人难以置信的新面向对象编程系统,为代码组合和重用提供了强大的新的面向对象技术。
严格模式(Strictures)——使用use strict指令可以在编译时捕获许多其他动态语言忽略的错误。当我使用Python或PHP时,我非常想念它。
自律(Self-discipline)——Perl赋予你写作和做任何想做的事情的自由。这意味着你必须学会写出清晰的代码,否则你会受到伤害。幸运的是,有一些工具可以帮助初学者。Perl::Critic可以对最佳实践进行代码类似于lint的分析。

1

当涉及到需要使用Python解析的任何工作时,我发现这个list非常有价值。

对于解析大型/复杂日志,我不会使用perl - 只是为了可读性(perl的速度对于我来说缺乏(处理大型任务)- 但这可能是我的perl代码(我必须改进))。

然而,如果grep目前完全符合您的需求 - 真的没有理由陷入编写一个完整的解析器中。最简单的解决方案通常是最好的,而grep是一个很好的工具。


1

你问题的另一个可能解释是“是否有任何工具可以使日志监视更容易?”,为了回答这个问题,我建议你看一下 Splunk 或者 Log4view


Sprog也相当不错:http://sprog.sourceforge.net/ - daotoad
Octopussy也很不错(免责声明:这是我的项目):http://www.8pussy.org - sebthebert

1

在Linux上,如果日志文件不太大,您可以使用shell(bash、ksh等)来解析它们。通常要使用的其他工具是grep和awk。但是,为了获得更多的编程能力,通常会使用awk。如果您有大文件需要解析,请尝试使用awk。

当然,也可以使用Perl、Python或几乎任何其他具有文件读取和字符串操作功能的语言。


-2

尝试 Nagios日志监控

这个工具之所以是您的最佳选择,原因如下:

它不需要安装外部软件包。这意味着,无需安装任何perl依赖项或可能让您感到紧张的傻瓜式软件包。

几乎没有学习曲线。您不需要学习任何编程语言来使用它。您只需要知道您想要对所考虑的日志执行什么操作,并阅读随工具附带的pdf文件。

如果您要解析的日志是syslog格式,则可以使用以下命令:

./NagiosLogMonitor 10.20.40.50:5444 logrobot autofig /opt/jboss/server.log 60m 'INFO' '.' 1 2 -show

即使您的日志不是已识别的格式,也可以使用以下命令有效地进行监控:

./NagiosLogMonitor 10.20.40.50:5444 logrobot autonda /opt/jboss/server.log 60m 'INFO' '.' 1 2 jbosslogs -ndshow

要解析特定字符串的日志,请将“INFO”字符串替换为您想在日志中监视的模式。如果您想搜索多个模式,请像这样指定它们:“INFO|ERROR|fatal”。

如果效率、简洁(和安全安装)对您很重要,那么这个Nagios工具就是您的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接