2011-04-20 55 views
1

即时将为exim4 MTA编写日志解析器,我有几个问题。 (我知道有一个exilog程序)exim4 mta的perl日志解析器

问: 1.什么是更好地解析线方式? (其这种线条的abbout的5Gb:d) 香港专业教育学院得到这个$行:

2011-12-24 12:32:12 MeSSag3-Id-Ye <hostname> ([email protected]) <[email protected]> => H=[321.123.321.123] T="Hello this is a test"

,并希望得到这一切领域到变量。 即时使用东西像($var,[var2])=($line =~ /somecoolregexp/);它是快/好还是我应该使用别的东西?

+0

这个问题有太多问题。请一次发布一个**特定**问题。 – Mat 2011-04-21 05:22:18

+0

好的。虐待编辑这个。 – MealstroM 2011-04-21 06:22:33

回答

1

那么,这取决于你想要对数据做什么。

假设你有解决这个大while (<>) { ... },您可以通过只使用分割得到的最简单的解析:

my @fields = split; 

下一级将增添几分意义

my ($date, $time, $id, $host, $from, $to, undef, $dest) = split; 

(注,如果你想忽略一个结果,你可以指定为undef

最后,你可以通过使用正则表达式清理大量的文件裂变。您也可以将上面的拆分与较小的正则表达式组合起来,分别清理每个字段。

my ($datetime, $id, $host, $from, $to, $dest) = 
    /([\d-]+ [\d:]+) \s+  # date and time together 
    (\S+)   \s+  # message id, just a block of non-whitespace 
    <(.*?)>   \s+  # hostname in angle brackets, .*? is non-greedy slurp 
    \((.*?)\)  \s+  # from email in parens 
    <(.*?)>   \s+  # to email in angle brackets 
     \S+   \s+  # separated between to-email and dest 
     (\S+)     # last bit, could be improved to (\w)=\[(.*?)\] 
    /x;      # /x lets us break all of this up, so its a bit readable 

当然,你可以继续服用这种种愚蠢的,但如果你要开始做这些领域的更具体的分析,我会与最初的拆分之后broken-去out字段解析。例如:

my ($date, $time, ...) = split; 

my ($year, $month, $day) = split(/-/, $date); 
my ($hour, $min, $sec) = split(/:/, $time); 
my ($from_user, $from_host) = ($from =~ /< ([^\@]+) \@ (.*) >/x); 
...etc... 
+0

Tnx。我计划使用CPAN :: Tail进行监控。我的第一个尝试是使用split(/ /,$ blabla),但它被T =“bla bla lba”或一些错误代码(如“问题是bla bla”)中的某些行破坏。我计划将日志导出到MySQL – MealstroM 2011-04-21 07:55:46