dmesgタイムスタンプ付きのLinux Centos


15

タイムスタンプ付きのCentos 5.x dmesgを読みたいのですが、どうすればよいですか?


後のdmesgは-Tフラグをサポートします。dmesgがサポートしている場合は、-Tを使用してみてください。
-ilansch

centos 7+サポートdmesg -T
rogerdpack

回答:


12

dmesgカーネルログリングバッファーを読み取ります。タイムスタンプは行いません。あなたがすべきことは、そのバッファからカーネルログを取得してファイルに送信するようにsyslogを設定することです(まだそうするように設定されていない場合)。/var/log/messages私が思い出すように、デフォルトのCentOS 5.x syslog configはカーネルログをに送信します。

/var/log/kern.logデフォルトのsyslogデーモンを使用して、すべてのカーネル(dmesg)ログをに送信する場合は、次のような行を追加します。/etc/syslog.conf

kern.*                         /var/log/kern.log

4
答えてくれてありがとう。CentOS 6を実行しているのを探している人のために、私はそれを見つけました/etc/rsyslog.conf
サファド

はい、CentOS(およびRHEL)6.xでは、デフォルトのsyslogデーモンを古いsysklogdからrsyslogに変更しました。RHEL / CentOS 5.xの(サポートされている)パッケージとしても利用可能です。
クリストファーキャシェル

1
さて、私はこれを把握するために物事のリストに載せましたが、今あなたは私にいくつかのグーグルを保存しました
サファド

8

ソリューション「dmesg / Kernel Ring Bufferのタイムスタンプを有効にする」があります

追加できます:

printk.time=1

カーネルcmdlineへ。

私に関しては、パペットを使用するすべてのマシンのrc.localに追加しました。私にとっては簡単です):

if test -f /sys/module/printk/parameters/time; then
   echo 1 > /sys/module/printk/parameters/time
fi

その私のための作品
c4f4t0r

5
を使用することrc.localは、実際にはこれに対するkindい解決策の一種です(rc.localほとんどの場合、使用は何に対してもい解決策です)。より良い解決策は、に入れるか、ファイルを入れるprintk.time = 1こと/etc/sysctl.confです/etc/sysctl.d/。それがこれらのファイルが存在する理由です。ものを詰め込むrc.localと、最終的には壊れやすく、複雑で、乱雑で信頼性の低いスタートアップになります。
クリストファーキャシェル14年

@ChristopherCashellからのコメントは、この質問に対する唯一の正しい答えです。実際の答えではないのは残念です。
ペトル

1

この簡単なスクリプトを書きました。はい、遅いです。より高速なものが必要な場合は、実際に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

役に立てば幸いです。:)


0

行が「[」で始まっていない場合のスクリプトの変更

#!/bin/bash
localtime() {
 perl -e "print(localtime($1).\"\n\");";
}

upnow=$(cut -f1 -d"." /proc/uptime)
upmmt=$(( $(date +%s) - ${upnow} ))

dmesg \
| while read LINE; do
    if [ "$(echo ${LINE} | egrep -v "^\[")" == "" ] ; then
        timestamp=$(echo "${LINE}" | sed "s/^\[ *\([0-9]\+\).*/\1/g")
        timestamp=$(( ${timestamp} + ${upmmt} ))
        echo "${LINE}" | sed "s/^[^]]\+]\(.*\)/$(localtime "${timestamp}") -\1/g"
    else
        echo "${LINE}"
    fi
done

0

これはPlutoidの提案の更新であり、タイムスタンプから先頭のスペースを削除します。

dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/( *)(\d+)\.\d+/localtime($2 + $a)/e; print $_;' 
  • perl -nは、標準入力を読み取り、変数$ _に読み取る方法です。
  • 次に、本体(BEGINセクションではない)が各行ごとに1回実行されます。
  • BEGINは{}のコードを1回実行します。
  • $ aはエポック(秒)以降のdmesgの開始です
  • s / ...コマンドは$ _の値を取得し、タイムスタンプの\ s * #####。######部分を、「localtime」バージョンのdmesgオフセット($ 1)に追加しますシステムの開始時間($ a)
  • print $ aは、「ブートからの秒数」タイムスタンプの代わりにロケールに優しいタイムスタンプでdmesgを出力します。

1
元の答えと同様に、説明が必要です。投稿を編集、分割、ステップ実行できますか?
コーリーKnutson

-1

以下のような小さなperlスクリプト。これは一般的な方法であり、私は著者ではありません。

dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/(\d+)\.\d+/localtime($1 + $a)/e; print $_;'
  • perl -n は、標準入力を読み取り、変数$ _に読み取る方法です。
  • 次に、本体(BEGINセクションではない)が各行ごとに1回実行されます。
  • BEGINは{}のコードを1回実行します。
  • $ aはエポック以降のdmesgの始まりです
  • s / ...コマンドは、$ _の値を取得し、タイムスタンプの#####。######部分を、システム起動に追加されたdmesgオフセットの "localtime"バージョン($ 1)に置き換えます。時間($ a)
  • print $ aは、「ブートからの秒数」タイムスタンプの代わりにロケールに優しいタイムスタンプでdmesgを出力します。

1
この答えにはさらに説明が必要です。
カスペルド

@kasperd意味は次のとおりです。-perl -nは、標準入力を読み取り、変数$ _に読み取る方法です。次に、本体(BEGINセクションではない)が各行ごとに1回実行されます。-BEGINは{}のコードを1回実行します。$ aはエポック以降のdmesgの開始です- s/...コマンドは$ _の値を取得し、タイムスタンプの#####。######部分を「localtime」バージョンのdmesgオフセット($ 1 )システムの開始時間($ a)に追加されました。- print $a「ブートからの秒数」タイムスタンプの代わりにロケールに優しいタイムスタンプでdmesgを出力します。
-dadinck
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.