2011-04-20 1 views
1

메신저 exim4 MTA 용 로그 파서를 작성하려고합니다. 몇 가지 질문이 있습니다. (내가 exilog 프로그램이 있다는 것을 알고)exim4 mta에 대한 펄 로그 파서

질문 : 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"

을 변수에 모든 필드를 얻을합니다. 지금 사용하고 있습니다. likethat ($var,[var2])=($line =~ /somecoolregexp/); 빨리/좋은가 아니면 다른 것을 사용해야합니까?

+0

이 질문에 너무 많은 질문이 있습니다. 한 번에 ** 특정 ** 질문을 게시하십시오. – Mat

+0

확인. 이걸 편집해라. – MealstroM

답변

1

글쎄, 그것은 데이터로 무엇을하고 싶은지에 달려 있습니다.

이 주위에 큰 while (<>) { ... }을 가정하면, 당신은 단지 분할을 사용하여 간단한 분석을 얻을 수 있습니다 :

my @fields = split; 

다음 수준은 의미

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

(주의 비트를 추가하는 것입니다 결과를 무시하려는 경우 undef에 할당 할 수 있습니다.

마지막으로 일반 expre를 사용하여 많은 cruft를 정리할 수 있습니다 시온. 위의 스플릿을 작은 정규 표현식과 결합하여 각 필드를 개별적으로 정리할 수도 있습니다. 물론

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

Tnx. CPAN :: Tail을 사용하여 모니터링하십시오. 내 첫번째 attemp는 split (/ /, $ blabla)을 사용했지만 T = "bla bla lba"또는 "the problem was bla lba"와 같은 오류 코드와 같은 몇 줄에 의해 손상되었습니다. Im 로그를 mysql로 ​​내보내려고합니다. – MealstroM