_/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の問題のデバッグに戻ることができますが、現時点ではそれを回避できます。
興味深い問題です。これを試したことがあるかどうかはわかりません。しかし、私はあなたが話しているタイムスタンプに気づきました、そして私はいつもそれがブートアップから数秒であると信じていました。
私のサーバーにある私のsyslogには、次のものが含まれています:
Jan 10 19:58:55 wdgitial kernel: [ 0.000000] Initializing cgroup subsys cpuset
Jan 10 19:58:55 wdgitial kernel: [ 0.000000] Initializing cgroup subsys cpu
Jan 10 19:58:55 wdgitial kernel: [ 0.000000] Linux version 2.6.32-21-server (buildd@yellow) (gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) ) #32-Ubuntu SMP Fri Apr 16 09:17:34 UTC 2010 (Ubuntu 2.6.32-21.32-server 2.6.32.11+drm33.2)
Jan 10 19:58:55 wdgitial kernel: [ 0.000000] Command line: root=/dev/xvda1 ro quiet splash
これは、ほとんどのLinuxディストリビューション間でかなり一貫していると思います。これは、カーネルがそれを吐き出すカーネルだからです。
そして、ここにタイムスタンプと一緒に日付があります。
あなたはこれを試してみることができます:
まず、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メソッドを使用します。 :)
サスペンド/レジューム中に時間のずれが変化することに気付いたので、これは少なくとも1か所に文書化されています。 dmesg(1)のマニュアルページには、次のように記載されています。
システムのSUSPEND/RESUMEの後、ログに使用されるタイムソースは更新されません。
カーネルがこれらのタイムスタンプをウォールタイムと同期させる方法を見つけることができませんでした。
Dmesgから日付に数値をマッピングする最も簡単な方法は、date
プログラムを使用することです。
date -d "-50595 seconds"
このコマンドは、現在時刻から50595秒を引いた日付を表示します。
man date
から:
-d, --date=STRING
display time described by STRING, not `now'
数値は、起動時からの経過時間ではなく、電源投入時の時間と同じです。
すばやく、汚れて、動作します。
$ dmesg | grep 3w | Perl /root/print_time_offset.pl
そのスクリプトの内容:
$ cat /root/print_time_offset.pl
#!/usr/bin/Perl
$uptime = `cat /proc/uptime | awk '{print $1}';`;
$boot = time() - $uptime;
chomp $boot;
while (<STDIN>) {
if ($_ =~ /^\[([\s\d\.]+)\]/) {
$time_offset = $1;
}
$real_time = sprintf scalar localtime($boot + $time_offset);
$_ =~ s/\[[\s\d\.]+\]/\[$real_time\]/;
print $_;
}
出力例は次のとおりです。
[Mon Feb 21 23:06:33 2011] 3ware 9000 Storage Controller device driver for Linux v2.26.02.012.
[Mon Feb 21 23:06:33 2011] 3w-9xxx 0000:03:00.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16
[Mon Feb 21 23:06:33 2011] 3w-9xxx 0000:03:00.0: setting latency timer to 64
[Mon Feb 21 23:06:33 2011] scsi4 : 3ware 9000 Storage Controller
[Mon Feb 21 23:06:33 2011] 3w-9xxx: scsi4: Found a 3ware 9000 Storage Controller at 0xfbcde000, IRQ: 16.
[Mon Feb 21 23:06:34 2011] 3w-9xxx: scsi4: Firmware FE9X 4.08.00.006, BIOS BE9X 4.08.00.001, Ports: 4.
[Mon Feb 21 23:06:35 2011] 3w-9xxx: scsi4: ERROR: (0x03:0x0101): Invalid command opcode:opcode=0x85.
[Mon Feb 21 23:06:35 2011] 3w-9xxx: scsi4: ERROR: (0x03:0x0101): Invalid command opcode:opcode=0x85.
[Mon Feb 21 23:06:35 2011] 3w-9xxx: scsi4: ERROR: (0x03:0x0101): Invalid command opcode:opcode=0x85.
[Mon Feb 21 23:06:35 2011] 3w-9xxx: scsi4: ERROR: (0x03:0x0101): Invalid command opcode:opcode=0x85.
[Mon Feb 21 23:06:35 2011] 3w-9xxx: scsi4: ERROR: (0x03:0x0101): Invalid command opcode:opcode=0x85.
[Mon Feb 21 23:06:35 2011] 3w-9xxx: scsi4: ERROR: (0x03:0x0101): Invalid command opcode:opcode=0x85.
[Sat Feb 26 02:01:01 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x0029): Verify started:unit=0, subunit=1.
[Sat Feb 26 02:01:01 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x0029): Verify started:unit=0, subunit=0.
[Sat Feb 26 16:49:13 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x002B): Verify completed:unit=0, subunit=1.
[Sat Feb 26 17:07:19 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x002B): Verify completed:unit=0, subunit=0.
[Sat Mar 5 02:00:16 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x0029): Verify started:unit=0, subunit=1.
[Sat Mar 5 02:00:16 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x0029): Verify started:unit=0, subunit=0.
[Sat Mar 5 18:48:57 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x002B): Verify completed:unit=0, subunit=1.
[Sat Mar 5 19:05:17 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x002B): Verify completed:unit=0, subunit=0.
[Sat Mar 12 02:00:30 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x0029): Verify started:unit=0, subunit=1.
[Sat Mar 12 02:00:30 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x0029): Verify started:unit=0, subunit=0.