【问题标题】:perl log parser for exim4 mtaexim4 mta 的 perl 日志解析器
【发布时间】:2011-08-09 14:23:21
【问题描述】:

我要为 exim4 MTA 编写日志解析器,我有几个问题。 (我知道有一个exilog程序)

问题: 1.解析一行的更好方法是什么? (其大约 5Gb 的此类行 :D ) 我得到了这条 $line:

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

并希望将所有这些字段放入变量。 我现在正在使用类似($var,[var2])=($line =~ /somecoolregexp/ ) 的东西;它是快/好还是我应该使用其他东西?

【问题讨论】:

  • 这个问题的问题太多了。请一次发布一个具体问题。

标签: perl parsing logging mta exim4


【解决方案1】:

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

假设你有一个很大的while (<>) { ... },你可以通过使用 split 来获得最简单的解析:

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

当然,您可以继续将其视为各种愚蠢的做法,但如果您要开始对这些字段进行更具体的解析,我会先进行初始拆分,然后再进行细分字段解析。例如:

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

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

【讨论】:

  • Tnx。我计划使用 CPAN::Tail 进行监控。我的第一次尝试是使用 split(/ /,$blabla) 但它被 T="bla bla lba" 之类的某些行或某些错误代码(例如“问题是 bla lba”)破坏了。我打算将日志导出到 mysql
猜你喜欢
  • 2014-03-23
  • 1970-01-01
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多