我正在尝试确定解析日志文件的最佳方法,并按类型计算其中的所有错误。目前,我在文本编辑器中打开日志,去掉日期和线程ID,然后对文件进行排序。这会将所有错误按类型放在一起,然后我可以计算(使用编辑器中的count函数,而不是手动)。我正在寻找一种自动执行此操作的方法,并可能将此作为学习新语言的机会(我知道最小的Perl和Ruby似乎可能适用于此任务)。日志文件看起来像(尖括号中的项目对于每一行都是可变的,而管道是日志中的实际字符):
<Datetime stamp> | <Thread ID> | ERROR | Foo.Bar: Backend error
<Datetime stamp> | <Thread ID> | ERROR | Foo.Bar: InvalidUserException
<Datetime stamp> | <Thread ID> | ERROR | Foo.Com: Timeout error
<Datetime stamp> | <Thread ID> | ALWAYS | Foo.Bar: Login Transaction [584] executed in [400] milliseconds
<Datetime stamp> | <Thread ID> | ALWAYS | Foo.Bar: Login Transaction [585] executed in [500] milliseconds
<Datetime stamp> | <Thread ID> | ALWAYS | Foo.Bar: Login Transaction [586] executed in [500] milliseconds
<Datetime stamp> | <Thread ID> | ALWAYS | Biz.Dee: Logout Transaction [958] executed in [630] milliseconds
<Datetime stamp> | <Thread ID> | ERROR | Foo.Bar: Backend error
我不想使用一系列grep命令,因为我必须知道要查找的内容 - 如果日志中有新错误,而不添加新命令,则不会计算。
我正在寻找的输出是这样的:
Foo.Bar: Backend error: 2 occurrences
Foo.Com: Timeout error: 1 occurrence
理想情况下,也可以计算平均交易时间:
Foo.Bar: Login Transaction: 3 occurrences with an average of 466 milliseconds
Biz.Dee: Logout Transaction: 1 occurrence with an average of 630 milliseconds
我见过其他SO帖子中提到的一些工具(SMTP log parser,Microsoft log parser,Zabbix和Splunk),但我还想了解一些新内容没有不必要的重复现有工具。 Perl或Ruby会成为这项任务的不错选择吗?我不是在寻找一个有效的脚本,而是在正确的方向上寻找一些指针,或者是一个很好的工具。
答案 0 :(得分:3)
Perl将是我解析字符串的首选。使用RegEx,您可以立即解析该日志文件。从我所看到的,看起来你正在处理一个很好的计算机可读文件。您可以使用Perl哈希来进行平均。
如果您对此更熟悉,可能会对C#及其RegEx执行相同的操作,但Perl是为了做这样的事情而构建的。
答案 1 :(得分:2)
这是一个可能的Perl起点:
#! /usr/bin/perl
use strict;
use warnings;
my %unique_messages;
while (<>)
{
my ($timestamp, $thread, $type, $message) = $_ =~
/^
([^|]+) \|
([^|]+) \|
([^|]+) \|
(.+)
$/x;
$unique_messages{$message}++ if $type =~ /ERROR/;
}
print $unique_messages{$_}, ' -> ', $_, "\n" for keys %unique_messages;
exit 0;
产地:
% ec.pl < err.log
1 -> Foo.Com: Timeout error
1 -> Foo.Bar: InvalidUserException
2 -> Foo.Bar: Backend error
答案 2 :(得分:1)
我会使用RegEx并计算出现次数。您可以使用多种语言执行此操作,即使是简单的shell脚本也可以执行此操作,例如
grep -E ".*ERROR.*\n" logfile | wc -l
答案 3 :(得分:1)
如果您了解/喜欢.NET,那么Marc Gravell和我开发的Push LINQ框架将是理想的候选者。基本上,您事先设置了所需的所有聚合(分组,求和等),并通过它“推送”日志文件,然后在最后询问结果。这将使您可以使用几乎恒定的内存消耗和单次传递数据来完成所有操作。
如果您想了解更多详情,请与我们联系。
答案 4 :(得分:1)
这是一个unix(或Cygwin)命令行方式:
这是命令行:
awk "FS=\"^|\";{print $4}" logfile.txt | sed -e "s/\[[0-9]*\]/[tid]/g" \
| sort | uniq -c | sort
这是输出:
1 Biz.Dee: Logout Transaction [id] executed in [id] milliseconds
1 Foo.Bar: Backend error
1 Foo.Bar: InvalidUserException
1 Foo.Com: Timeout error
3 Foo.Bar: Login Transaction [id] executed in [id] milliseconds
答案 5 :(得分:0)
使用awk的另一种可能性:
grep ERROR filename.log | awk -F'|' '{ print $4 }' | awk -FS=':' '{count[$1]++}END{for(j in count) print j,": "count[j]" occurence(s)"}'
答案 6 :(得分:0)
您可以使用像君主这样的程序为平面数据提供结构。我用它来获取文本文件并从中创建我可以在数据库中使用的表。
答案 7 :(得分:0)
微软日志解析器,如果你对SQL没问题的话。并使用Windows。免费且非常方便。易于包装在HTA中,然后您可以使用VBS或(?)JS以交互方式构建查询字符串。相信它会为你做小计。当然是种类和群体。
答案 8 :(得分:0)
在vim中,您可以执行:%s/pattern//n
,其中pattern是搜索字符串。