web-dev-qa-db-ja.com

dmesg出力の監視

Linuxサーバーの1つで低レベルで問題が発生すると、カーネルリングバッファーにそのメッセージが表示されることがわかりました。これらは、dmesgコマンドを使用してコマンドラインから表示できます。

サーバーをカーネルリングバッファに接続する簡単な方法があるかどうか疑問に思っています何かが追加されるたびに私にメールしてください

現在、1時間ごとに実行され、dmesgの出力のコピーを作成し、前の1時間のファイルに対してdiffを実行するスクリプトがあります。残念ながら、これはあまりうまく機能しません。これは、dmesg出力の最後に行が追加されるため、他の行が最初から切り捨てられるためです。また、同じメッセージがたくさんあると、通知がまったく停止します。

  • これを行うためのより良い方法はありますか?

  • 他の誰かが、これらのメッセージが発生したときにそれらを見ることが重要だと思いますか?

追加

  • dmesgコマンドによって報告される情報は、ログファイルの1つと同じですか? (もしそうなら、解決策は私が思っていたよりも簡単です)
2
Brent

次のスクリプトは、/ 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
1
Brent

この情報を収集し、定期的に報告するように設計されたツールがいくつかあります。

Lireツール( LogReport システムから)は優れたレポートツールであることがわかりましたが、 Logcheck および Logwatch にも興味があるかもしれません。すべて フリーソフトウェア であり、ほとんどの主要なGNU/Linuxパッケージリポジトリから直接インストールできます。

2
bignose

これは迅速で汚い解決策です。あなたはたくさんのメールを受け取るかもしれません。 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に変更されました。

2

Kern.logがなく、作成して保持したい場合は、/ etc/syslog.confを編集して、以下を追加します。

kern.* -/var/log/kern.log

Syslogdの構成についてさらにヘルプが必要な場合は、「man5syslog.conf」を試してください。

また、swatch( http://sourceforge.net/projects/swatch/ )は、ログファイルを監視するように簡単に構成できるもう1つのツールです。

0
StackKrish

ストリームを読み取り、日付テンプレートに基づいて分割する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ディレクトリにログのバックアップもあります。

0
sunny256

StackKrishは正しい方向に進んでいますが、それでもメールを送信しません。これを行うには、program()宛先を持つプログラムへのコマンドへのロギングを可能にするsyslog-ngのようなものを使用できます。それを望まない場合は、通常のsyslogdを取得して名前付きパイプ/ FIFOにログを記録し、それを電子メールを送信する単純なスクリプトに接続することができます。

0
TimDaMan