Perl のログ解析のこれらの行は何をしているのでしょうか?どうすれば機能する可能性のあるものを思いつくことができますか?
-
12-12-2019 - |
質問
この問題は、pop-before-smtp / Postfix / Dovecot のコンテキストで発生しますが、Perl の文字列解析を知っていれば、自分で答えを見つけることができます。しかし、私は非常に迷っており、正確な質問さえわかりません。つまり:
私たちは長い間 Postfix を使用しており、すっかり虜になっています。今、私たちは「現代に移行」し、ネットワークの外にいても SMTP サーバーから電子メールを送信できるようにする必要があります。そこで、この仕事を任された私は、pop-before-smtp を見つけました。
見つけられますよ ここ.
それで、すべて設定しましたが、テストで失敗します。指示に従ってトラブルシューティングを行いました ここ, 、ログを解析しようとしている Perl が間違っているようだと判断しました。IMAP / POP サーバーとして Dovecot を使用しており、構成ファイルには 3 つの選択肢があります。以下は、3 つのセットを示す構成ファイルからの抜粋です。
# For Dovecot POP3/IMAP when using syslog.
#$pat = '^[LOGTIME] \S+ (?:dovecot: )?(?:imap|pop3)-login: ' .
# 'Login: .*? (?:\[|rip=)[:f]*(\d+\.\d+\.\d+\.\d+)[],]';
#$out_pat = '^[LOGTIME] \S+ (?:dovecot: )?(?:imap|pop3)-login: ' .
# 'Disconnected.*? (?:\[|rip=)[:f]*(\d+\.\d+\.\d+\.\d+)[],]';
# For Dovecot POP3/IMAP when it does its own logging.
##$logtime_pat = '(\d\d\d\d-\d+-\d+ \d+:\d+:\d+)';
#$pat = '^dovecot: [LOGTIME] Info: (?:imap|pop3)-login: ' .
# 'Login: .+? rip=[:f]*(\d+\.\d+\.\d+\.\d+),';
#$out_pat = '^dovecot: [LOGTIME] Info: (?:imap|pop3)-login: ' .
# 'Disconnected.*? rip=[:f]*(\d+\.\d+\.\d+\.\d+),';
# For older Dovecot POP3/IMAP when it does its own logging.
#$pat = '^(?:imap|pop3)-login: [LOGTIME] Info: ' .
# 'Login: \S+ \[[:f]*(\d+\.\d+\.\d+\.\d+)\]';
#$out_pat = '^(?:imap|pop3)-login: [LOGTIME] Info: ' .
# 'Disconnected.*? \[[:f]*(\d+\.\d+\.\d+\.\d+)\]';
該当するもののコメントを解除する必要がありますが、どれも機能しません。
「pat」はログインのパターンで、out-pat はログアウトまたは切断のパターンだと思います。
実際のログ レコード形式は、これら 3 つの形式とは明らかに異なりますが、似ています。以下にペアの例を示します。
Mar 11 17:53:55 imap-login: Info: Login: user=<username>, method=PLAIN, rip=208.54.4.205, lip=192.168.1.1, TLS
Mar 11 17:59:10 IMAP(username): Info: Disconnected: Logged out bytes=352/43743
POP を使用すると、「imap-login」が「pop-login」に置き換えられ、ログアウト時に「POP」が「IMAP」に置き換えられます。なぜ大文字が変更されるのかはわかりません。
重要なデータは次のとおりです。タイムスタンプ、ユーザー名、およびログイン時の「リモート」IP (「rip」)。
十分な時間があれば、うまくいくものを組み立てることができるかもしれませんが、実際には Perl を知らないので、これはちょっと難しいです。Dovecot パッケージで使用されるログ出力を解析するための新しいルールの作成を手伝ってください。
解決
の (:?..
Perl 正規表現の一部が要求する クラスタリング だがしかし 捕獲する;これにより、キャプチャ グループの番号に影響を与えることなく、グループ全体をグループとして一致または無視することができます。すべての行は、許可する IP という 1 つのフィールドを正確にキャプチャします。(これは少し奇妙です。ユーザー名と IP の両方を期待していたかもしれませんが、長期的にはこの方が簡単かもしれません。)
# For Dovecot POP3/IMAP when using syslog.
$pat = '^[LOGTIME] \S+ (?:imap|pop3)-login: Info: ' .
'Login: .*? (?:\[|rip=)[:f]*(\d+\.\d+\.\d+\.\d+)[],]';
# not necessary? see comment header START OF PATTERNS
# $out_pat = '^[LOGTIME] \S+ (?:IMAP|POP3)\(\S+\): Info: ' .
# 'Disconnected.*';
を削除しました dovecot
あなたの入力に含まれていなかったので、部分。を追加しました Info:
両方の行に。を修正しました $out_pat
使用する IMAP(username)
もう存在しないものの代わりに imap-login
オリジナルから。(の用法 \S+
ユーザー名にスペースが含まれる場合は壊れます。この仮定はファイル内の別の場所で行われているので、問題ないと思います。)
ログアウト行にキャプチャする IP アドレスがなくなったため、おそらく次のことが最善です。 定義しない $out_pat
-- の START OF PATTERNS
コメントブロックにフレーズが含まれています 選択したエントリに以下の内容が含まれている場合は、 $out_pat
, の場合は、その変数のコメントも解除する必要があります。これにより、サーバーにまだ接続しているユーザーを追跡できるようになります(例:Thunderbird キャッシュは IMAP 接続を開きます)。
私はこれをテストしていませんが、良い感触を持っています。