2009-01-23 39 views
0

我正在嘗試確定解析日誌文件並根據類型計算所有錯誤的最佳方法。目前,我在文本編輯器中打開日誌,去掉日期和線程ID,然後對文件進行排序。這將所有錯誤按類型放在一起,然後我可以計算(使用編輯器中的計數函數,而不是手動計數)。我正在尋找一種自動執行此操作的方法,並可能將此用作學習新語言的機會(我知道最小的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,ZabbixSplunk),但我也想學習一些新的東西,而不必重複現有的工具。 Perl或Ruby會成爲這項任務的不錯選擇嗎?我不是在尋找一個可行的腳本,而是尋找正確方向的一些指針或一個很好的工具。

回答

3

Perl將是我的第一個字符串解析選擇。使用RegEx,您可以立即解析該日誌文件。從我可以看到它看起來你正在處理一個很好的計算機可讀文件。您可以使用Perl哈希來進行平均。

如果你更熟悉C#和它們的RegEx,你可能會做同樣的事情,但Perl的目的是做這樣的事情。

+0

如何對所有相同的錯誤進行分組和計數?我知道正則表達式會計算所有匹配的項目,但我需要將它們分組,而不知道完整的錯誤文本可能是什麼。我可以匹配「錯誤|」但是這太寬泛了,匹配一個特定的錯誤可能會導致一個新的錯過 – 2009-01-23 19:02:06

1

我會使用RegEx並計算出現次數。您可以使用各種語言來完成這項工作,即使是一個簡單的shell腳本也可以做到這一點,例如

grep -E ".*ERROR.*\n" logfile | wc -l 
+0

這隻會給所有錯誤的計數,而不是按類型的每個錯誤的計數,這是我所需要的。 – 2009-01-23 19:04:20

1

如果你知道/喜歡.NET中,Push LINQ框架,馬克Gravell和我開發將是這是一個理想的人選。基本上,您事先設置了所有您想要的聚合(分組,求和等),並通過它「推送」日誌文件,然後在最後詢問結果。這可以讓你用接近恆定的內存消耗和單次傳遞數據來做所有事情。

讓我知道你是否想要更多的細節。

1

下面是一個UNIX(或Cygwin)命令行的方式做到這一點有:

  • AWK命令(解析出第4場,你的字段由管道「|」分隔)
  • 一個SED命令來替換交易#([584])以上,使分組更容易(與[TID])
  • sort和uniq找到和計數重複行:

這裏是命令行:

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 
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 
0

使用a的另一種可能性wk:

grep ERROR filename.log | awk -F'|' '{ print $4 }' | awk -FS=':' '{count[$1]++}END{for(j in count) print j,": "count[j]" occurence(s)"}' 
0

您可以使用像君主這樣的程序爲平面數據提供結構。我已經用它來獲取文本文件,並使它們可以在數據庫中使用。

0

微軟日誌解析器,如果你確定SQL。並使用Windows。免費且非常方便。易於在HTA中打包,然後您可以使用VBS或(?)JS以交互方式構建查詢字符串。相信它會爲你做小計。當然可以分類和分組。

0

在vim中你可以做:%s/pattern//n其中pattern是搜索字符串。

相關問題