中央のsyslogサーバーにログを記録するサーバーがいくつかあり、syslog-ngを使用してログを収集します。
Loggerコマンドを使用してタグ付きのログを送信します。
$ logger -n 01.02.03.04 "Hello from $Host at $(date)" -t MY_SPECIFIC_TAG -p local2.error
次に、syslog-ngを使用して、メッセージは次のように書き込まれます。
Mar 5 23:36:04 05.06.07.08 MY_SPECIFIC_TAG: Hello from vps1234567 at Tue Mar 5 23:36:04 CET 2019
私の目的は、すべてのアプリケーション(Java、Apache、mysqlなど)がメッセージを生成するアプリを識別するタグを使用してログを送信するようにすることです。これにより、syslogサーバーのログを次の名前と一致するファイルに書き込むことができます。アプリ。
メッセージから文字列MY_SPECIFIC_TAGを抽出し、それをファイルのパスの変数として使用することは可能ですか?
この抽出はsyslog-ng構成ファイルで実行する必要があるため、次のように宛先を書き込むことができます。
destination dst_custom{
file("${MY_SPECIFIC_TAG}-${FACILITY}-${LEVEL}-${YEAR}-${MONTH}-${DAY}.log");
};
わかりました、私はそれを解決しました:
Syslog-ngマクロ${PROGRAM}
この情報を抽出します。
BLUF:はい、そうです。
Q:タグをすでに知っている場合、なぜそれを抽出する必要があるのですか?
Posit 1:わかっていますMY_SPECIFIC_TAGそしてメッセージファイルから抽出したい:grep MY_SPECIFC_TAG /var/log/messages | sed -n "1s/^[A-Z][a-z][a-z] [0-9:.]* (.): ./\1/p"
これでMY_SPECIFIC_TAG(または少なくともかなり近い)が得られるはずです。 YMMV
位置2:わかっていますMY_SPECIFIC_TAGしかし、その前のパス(つまり、/ path/to/program/MY_SPECIFIC_TAG)はわかりません。grep MY_SPECIFC_TAG /var/log/messages | sed -n "1s+^[A-Z][a-z][a-z] [0-9:.]* (/[a-zA-Z0-9/]/.): .*+\1+p"
それはあなたが探しているものですか?
これを変数として設定するには、コマンド全体を$()内に配置し、それを割り当ての右側として使用します。my_path_var=$( {command from above} )
PDATE:MY_SPECIFIC_TAGが何であるかわからず、それらを見つけたい場合:cat /var/log/messages | sed -n "s/^[A-Z][a-z][a-z] [0-9:.]* (.): ./\1/p" | sort -u
これにより、タグのない行は印刷されません。
さて、あなたがすべての「UUOC!」に行く前に私の場合、このコマンドと古いコマンドの比較を示すために、この方法で実行しました。そうすれば、OP(およびその他の将来のリーダー)は、これらのコマンドをシステムに合わせて簡単に調整できます。
注:UUOC =猫の不必要な使用。ファイル名はp "の後に配置し、catコマンドを削除できます。ただし、ここでは説明のためにcatを使用しています。