Linuxサーバーの1つで低レベルで問題が発生すると、カーネルリングバッファーにそのメッセージが表示されることがわかりました。これらは、dmesgコマンドを使用してコマンドラインから表示できます。
サーバーをカーネルリングバッファに接続する簡単な方法があるかどうか疑問に思っています何かが追加されるたびに私にメールしてください?
現在、1時間ごとに実行され、dmesgの出力のコピーを作成し、前の1時間のファイルに対してdiffを実行するスクリプトがあります。残念ながら、これはあまりうまく機能しません。これは、dmesg出力の最後に行が追加されるため、他の行が最初から切り捨てられるためです。また、同じメッセージがたくさんあると、通知がまったく停止します。
これを行うためのより良い方法はありますか?
他の誰かが、これらのメッセージが発生したときにそれらを見ることが重要だと思いますか?
追加
次のスクリプトは、/ var/log /kern.logへの新しいエントリをrootユーザーに送信します。
これを/ etc/cron.hourlyに入れると、1時間ごとにメールが送信されますが、新しいカーネルメッセージがある場合に限ります。
#!/bin/bash
MAILTO=root
LOG=/var/log/kern.log
OFFSET_FILE=$0.offset
if [ ! -f $OFFSET_FILE ]; then echo 0 > $OFFSET_FILE; fi
OFFSET=`cat $OFFSET_FILE`
FILESIZE=`cat $LOG|wc -c`
# Check if log has been rotated
if [ "$OFFSET" -gt "$FILESIZE" ]; then
OFFSET=0
echo 0 > $OFFSET_FILE
fi
if [ "$FILESIZE" -gt "$OFFSET" ]; then
tail -c+$OFFSET $LOG|sed "s/^/ /"|mail $MAILTO -s "new kernel alerts"
echo $FILESIZE > $OFFSET_FILE
fi
これは迅速で汚い解決策です。あなたはたくさんのメールを受け取るかもしれません。 grep
および/またはgrep -v
コマンドをいくつか追加することをお勧めします。もちろん、この手法を他のログファイルにも使用できます。このコマンドを/etc/rc.d/rc.local
またはシステムの同等のものに追加します(コマンドラインからテストした後)。
Sudo tail -F /var/log/messages | while read line ; do echo "$line"|mail -s Subject recipient; done &
編集:ログローテーションを処理できるように、テールがファイルの後に名前で続くように大文字のFに変更されました。
Kern.logがなく、作成して保持したい場合は、/ etc/syslog.confを編集して、以下を追加します。
kern.* -/var/log/kern.log
Syslogdの構成についてさらにヘルプが必要な場合は、「man5syslog.conf」を試してください。
また、swatch( http://sourceforge.net/projects/swatch/ )は、ログファイルを監視するように簡単に構成できるもう1つのツールです。
ストリームを読み取り、日付テンプレートに基づいて分割するcronolog(1)と呼ばれるNiceユーティリティがあります。私のApache設定ファイルの1つからの例:
CustomLog "|/usr/bin/cronolog -z0 /var/log/Apache2/example.org/%Y/%Y-%m-%dZ.access_log" combined
これにより、すべてのApacheログがexample.org/yyyy/yy-mm-ddZ.access_log形式に分割され、一般的に作業が楽になります。
さて、これをあなたの状況でどのように使用できるか:/ var/log/messagesで発生するすべてをログに記録するプロセスを開始します:
tail -F /var/log/messages | cronolog -z0 /var/log/mylog/dmesg/%Y-%m-%d_%H.log &
これにより、出力がファイル名形式のファイルに分割されます
/var/log/mylog/dmesg/yyyy-mm-dd_hh.log
1時間の2分ごとに、過去1時間にログファイルが生成されたかどうかを確認するcronからのスクリプトを実行します。このようなもの:
#!/bin/bash
# This script is executed every XX:02 from cron
LOGDIR=/var/log/mylog/dmesg
# Get date string five minutes ago
LOGDATE=$(date -u +"%Y-%m-%d_%H" -d "5 min ago")
if [ -e $LOGDIR/$LOGDATE.log ]; then
mail -s "dmesg log for $LOGDATE" [email protected] <$LOGDIR/$LOGDATE.log
fi
ファイルが見つからない場合、メールは送信されません。このシステムでは、$ LOGDIRディレクトリにログのバックアップもあります。
StackKrishは正しい方向に進んでいますが、それでもメールを送信しません。これを行うには、program()宛先を持つプログラムへのコマンドへのロギングを可能にするsyslog-ngのようなものを使用できます。それを望まない場合は、通常のsyslogdを取得して名前付きパイプ/ FIFOにログを記録し、それを電子メールを送信する単純なスクリプトに接続することができます。