解決策 1:
dmesg
カーネル ログ リング バッファを読み取ります。タイムスタンプは行いません。すべきことは、そのバッファからカーネルログを取得してファイルに送信するように syslog を構成することです (そうするようにまだ設定されていない場合)。 CentOS 5.x のデフォルトの syslog 設定では、カーネル ログが /var/log/messages
に送信されることに注意してください。
すべてのカーネル (dmesg) ログを /var/log/kern.log
に送信したい場合 、デフォルトの syslog デーモンを使用して、次のような行を /etc/syslog.conf
に追加します
kern.* /var/log/kern.log
解決策 2:
「dmesg/Kernel Ring Buffer のタイムスタンプを有効にする」という解決策があります
以下を追加できます:
printk.time=1
カーネルコマンドラインへ。
私に関しては、パペットを備えたすべてのマシンで rc.local に追加しました。私にとっては簡単です) :
if test -f /sys/module/printk/parameters/time; then
echo 1 > /sys/module/printk/parameters/time
fi
解決策 3:
この簡単なスクリプトを書きました。はい、遅いです。より高速なものが必要な場合は、実際に perl や python などでスクリプトを作成します。この単純なスクリプトで、計算方法のこつがわかるはずです。
各行に登録されている秒の端数 (タイムスタンプの . の後) を無視したことに注意してください。
#!/bin/bash
localtime() {
perl -e "print(localtime($1).\"\n\");";
}
upnow="$(cut -f1 -d"." /proc/uptime)"
upmmt="$(( $(date +%s) - ${upnow} ))"
dmesg | while read line; do
timestamp="$(echo "${line}" | sed "s/^\[ *\([0-9]\+\).*/\1/g")"
timestamp=$(( ${timestamp} + ${upmmt} ))
echo "${line}" | sed "s/^[^]]\+]\(.*\)/$(localtime "${timestamp}") -\1/g"
done
お役に立てば幸いです。 :)