exim4 mta的perl日志解析器

exim4 mta的perl日志解析器,perl,parsing,logging,mta,exim4,Perl,Parsing,Logging,Mta,Exim4,我将为exim4 MTA编写日志解析器,我有几个问题。 (我知道有一个exilog程序) 问题: 1.解析行的更好方法是什么?(这类行的缩写为5Gb:D) 我有一句话: 2011-12-24 12:32:12消息(from@some.email)=>H=[321.123.321.123]T=“你好,这是一个测试” 并希望将所有这些字段转换为变量。 我现在使用的是($var,[var2])=($line=~/somecoolregexp/);它是快/好还是我应该用别的东西?好吧,这取决于你想对数据

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

问题: 1.解析行的更好方法是什么?(这类行的缩写为5Gb:D) 我有一句话:

2011-12-24 12:32:12消息(from@some.email)=>H=[321.123.321.123]T=“你好,这是一个测试”

并希望将所有这些字段转换为变量。
我现在使用的是
($var,[var2])=($line=~/somecoolregexp/)
;它是快/好还是我应该用别的东西?

好吧,这取决于你想对数据做什么

假设您有一个大的
while(){…}
,只需使用split即可获得最简单的解析:

my @fields = split;
下一个层次是增加一点意义

my ($date, $time, $id, $host, $from, $to, undef, $dest) = split;
(注意,如果要忽略结果,可以指定给
unde

最后,您可以通过使用正则表达式来清除许多积垢。您还可以将上面的拆分与较小的regexp组合,以单独清理每个字段

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($datetime,$id,$host,$from,$to,$dest)=
/([\d-]+[\d:]+)\s+#日期和时间在一起
(\S+)\S+#消息id,只是一块非空白
\s+#尖括号中的主机名,*?这是非贪婪的咕噜声吗
\((.*)\)\s+#来自parens中的电子邮件
\s+#以尖括号形式发送电子邮件
\S+\S+#分为发送电子邮件和发送目的地
(\S+)#最后一位,可以改进为(\w)=\[(.*)\]
/x、 #/x让我们把所有这些都分解,所以它有点可读性
当然,你可以继续把它理解成各种各样的愚蠢行为,但是如果你要开始对这些字段进行更具体的解析,我会先进行初始拆分,然后进行断开的字段解析。例如:

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

 my ($year, $month, $day)    = split(/-/, $date);
 my ($hour, $min,   $sec)    = split(/:/, $time);
 my ($from_user, $from_host) = ( $from =~ /< ([^\@]+) \@ (.*) >/x );
 ...etc...
my($date,$time,…)=拆分;
我的($year,$month,$day)=拆分(/-/,$date);
我的($hour,$min,$sec)=拆分(/:/,$time);
我的($from\u user,$from\u host)=($from=~/<([^\@]+)\@(.*)>/x);
等

好吧,这取决于你想对数据做什么

假设您有一个大的
while(){…}
,只需使用split即可获得最简单的解析:

my @fields = split;
下一个层次是增加一点意义

my ($date, $time, $id, $host, $from, $to, undef, $dest) = split;
(注意,如果要忽略结果,可以指定给
unde

最后,您可以通过使用正则表达式来清除许多积垢。您还可以将上面的拆分与较小的regexp组合,以单独清理每个字段

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($datetime,$id,$host,$from,$to,$dest)=
/([\d-]+[\d:]+)\s+#日期和时间在一起
(\S+)\S+#消息id,只是一块非空白
\s+#尖括号中的主机名,*?这是非贪婪的咕噜声吗
\((.*)\)\s+#来自parens中的电子邮件
\s+#以尖括号形式发送电子邮件
\S+\S+#分为发送电子邮件和发送目的地
(\S+)#最后一位,可以改进为(\w)=\[(.*)\]
/x、 #/x让我们把所有这些都分解,所以它有点可读性
当然,你可以继续把它理解成各种各样的愚蠢行为,但是如果你要开始对这些字段进行更具体的解析,我会先进行初始拆分,然后进行断开的字段解析。例如:

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

 my ($year, $month, $day)    = split(/-/, $date);
 my ($hour, $min,   $sec)    = split(/:/, $time);
 my ($from_user, $from_host) = ( $from =~ /< ([^\@]+) \@ (.*) >/x );
 ...etc...
my($date,$time,…)=拆分;
我的($year,$month,$day)=拆分(/-/,$date);
我的($hour,$min,$sec)=拆分(/:/,$time);
我的($from\u user,$from\u host)=($from=~/<([^\@]+)\@(.*)>/x);
等

这个问题中的问题太多了。请一次发布一个具体问题。这个问题中的问题太多了。请一次发布一个具体问题。Tnx。Im计划使用CPAN::Tail进行监视。我的第一个尝试是使用split(/,$blablabla),但它被一些行(如T=“bla bla lba”)或一些错误代码(如“问题是bla lba”)打断。我计划将日志导出到mysqlTnx。Im计划使用CPAN::Tail进行监视。我的第一个尝试是使用split(/,$blablabla),但它被一些行(如T=“bla bla lba”)或一些错误代码(如“问题是bla lba”)打断。我计划将日志导出到mysql