質問: / var / log / *タイムスタンプの関連付け _/var/log/messages_、_/var/log/syslog_、および他の一部のログファイルは、_jan 13 14:13:10_のような絶対時間を含むタイムスタンプを使用します。_/var/log/xorg.0.log_と_/var/log/dmesg_、および_$ dmesg_の出力は、次のような形式を使用します_[50595.991610] malkovich: malkovich malkovich malkovich malkovich _数字は起動後の秒とマイクロ秒を表していると推測/収集しています。ただし、これらの2つのタイムスタンプのセットを(uptimeからの出力を使用して)相互に関連付けようとすると、約5000秒の差異が生じました。これは、お使いのコンピューターが一時停止されていた時間とほぼ同じです。dmesgとxorgが使用する数値のタイムスタンプを絶対タイムスタンプにマッピングする便利な方法はありますか?更新これを理解するための準備ステップとして、また私の質問をもう少し明確にするために、 pythonスクリプト を記述して_/var/log/syslog_を解析し、出力します時間のずれ。 ubuntu 10.10を実行している私のマシンでは、このファイルには、dmesgタイムスタンプとsyslogタイムスタンプの両方でスタンプされた、カーネルが生成した多数の行が含まれています。スクリプトは、カーネルタイムスタンプを含むそのファイルの各行の行を出力します。使用法:_python syslogdriver.py /var/log/syslog | column -nts $'\t' _消去された出力(列の定義については以下を参照):_abs abs_since_boot rel_time rel_offset message jan 13 07:49:15 32842.1276569 32842.301498 0 malkovich malkovich _... _rel_offset_はすべての間にある行で0です..._jan 13 09:55:14 40401.1276569 40401.306386 0 pm: syncing filesystems ... done. jan 13 09:55:14 40401.1276569 40401.347469 0 pm: preparing system for mem sleep jan 13 11:23:21 45688.1276569 40402.128198 -5280 skipping edid probe due to cached edid jan 13 11:23:21 45688.1276569 40402.729152 -5280 freezing user space processes ... (elapsed 0.03 seconds) done. jan 13 11:23:21 45688.1276569 40402.760110 -5280 freezing remaining freezable tasks ... (elapsed 0.01 seconds) done. jan 13 11:23:21 45688.1276569 40402.776102 -5280 pm: entering mem sleep _... _rel_offset_は残りのすべての行で-5280です..._jan 13 11:23:21 45688.1276569 40403.149074 -5280 acpi: preparing to enter system sleep state s3 jan 13 11:23:21 45688.1276569 40403.149477 -5280 pm: saving platform nvs memory jan 13 11:23:21 45688.1276569 40403.149495 -5280 disabling non-boot cpus ... jan 13 11:23:21 45688.1276569 40403.149495 -5280 back to c! jan 13 11:23:21 45688.1276569 40403.149495 -5280 pm: restoring platform nvs memory jan 13 11:23:21 45688.1276569 40403.151034 -5280 acpi: waking up from system sleep state s3 _...最後の行は少し下からですが、まだ出力の最後を上回っています。それらのいくつかはおそらくdmesgの循環バッファー。その後、syslogにのみ伝搬されました。これが、これらすべてのsyslogタイムスタンプが同じである理由を説明しています。列の定義:absは、syslogによって記録された時間です。_abs_since_boot_は、_/proc/uptime_の内容とtime.time()の値に基づいて、システム起動後の同じ秒数です。_rel_time_はカーネルのタイムスタンプです。_rel_offset_は、_abs_since_boot_と_rel_time_の違いです。絶対(つまりsyslog- generated)タイムスタンプが秒の精度しか持たないことによる1回限りのエラーを回避するために、これを数十秒に丸めています。これは実際には正しい方法ではありません。なぜなら、実際に(私が思うに...)、10を外すエラーが発生する可能性が小さくなるためです。誰かがより良いアイデアを持っている場合は、私に知らせてください。また、syslogの日付形式についても質問があります。特に、一年がそこに表れるのではないかと思います。私はそうではないと思います。いずれにせよ、tfmでその情報に自分自身を助ける可能性が最も高いのですが、誰かがたまたま知っていれば、それは役に立つでしょう。 ..もちろん、perlコードの数行をバスアウトするのではなく、誰かが将来このスクリプトを使用すると仮定します。次:ですから、あなたからの歓迎の啓示が私に与えられない限り、私の次のステップは、特定のカーネルタイムスタンプの時間のずれを取得する関数を追加することです。絶対タイムスタンプを取得するために、スクリプトにカーネルタイムスタンプとともに1つまたは一連のsyslogを供給することができるはずです。その後、xorgの問題のデバッグに戻ることができますが、現時点ではそれを回避できます。
回答: あなたはこれを試してみることができます:まず、dmesgファイルのタイムスタンプを取得します(私の想定では、これはdmesgの時間0になります)。使用しますls -l --time-style = +%s/var/log$ ls -l --time-style=+%s dmesg -rw-r----- 1 root adm 56181 1294941018 dmesg 秒を人間が読める日付に変換できますperl -e 'print scalar localtime(1294941018)' したがって、読み取り可能なイベント時間を確認するには、dmesgでイベントの秒数を追加します。 dmesgイベントが55.290387秒であった場合は、55または55.290387を追加します。perl -e 'print scalar localtime(1294953978 + 55)' エポカルルートの秒を読み取り可能な時間に変換する別の方法は、提案されているようにdate -dを使用することです。 'date'に-dで指定された時刻を表すように指示する場合、@を使用して、変換される時刻がエポック以降の秒であることを示すことができます。date -d "@1294953978" これにより、「木1月13日15:26:18 cst 2011」のような出力が得られます。日付+%sシェルの計算方法を思い出せないので、通常は上記のようにperlメソッドを使用します。 :)