/var/log/messages
,, /var/log/syslog
dan beberapa file log lainnya menggunakan stempel waktu yang berisi waktu absolut, seperti Jan 13 14:13:10
.
/var/log/Xorg.0.log
dan /var/log/dmesg
, serta output dari $ dmesg
, gunakan format yang terlihat seperti
[50595.991610] malkovich: malkovich malkovich malkovich malkovich
Saya menduga / mengumpulkan bahwa angka mewakili detik dan mikrodetik sejak startup.
Namun, upaya saya untuk mengkorelasikan dua set cap waktu ini (menggunakan output dari uptime
) memberikan perbedaan sekitar 5000 detik.
Ini kira-kira jumlah waktu komputer saya diskors.
Apakah ada cara mudah untuk memetakan cap waktu numerik yang digunakan oleh dmesg dan Xorg menjadi cap waktu absolut?
memperbarui
Sebagai langkah awal menuju penyelesaian masalah ini, dan juga semoga membuat pertanyaan saya sedikit lebih jelas, saya telah menulis skrip Python untuk mengurai /var/log/syslog
dan menampilkan waktu yang miring. Di komputer saya, menjalankan ubuntu 10.10, file itu berisi banyak baris yang berasal dari kernel yang dicap baik dengan stempel waktu dmesg dan stempel waktu syslog. Script menampilkan baris untuk setiap baris dalam file yang berisi cap waktu kernel.
Pemakaian:
python syslogdriver.py /var/log/syslog | column -nts $'\t'
Output yang dihapuskan (lihat di bawah untuk definisi kolom):
abs abs_since_boot rel_time rel_offset message
Jan 13 07:49:15 32842.1276569 32842.301498 0 malkovich malkovich
... rel_offset
adalah 0 untuk semua jalur intervensi ...
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
adalah -5280 untuk semua saluran yang tersisa ...
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
... Baris terakhir dari sedikit lebih jauh ke bawah, masih jauh di atas akhir output. Beberapa dari mereka mungkin ditulis ke dmesg
buffer bundar sebelum penangguhan terjadi, dan hanya diperbanyak syslog
setelah itu. Ini menjelaskan mengapa mereka semua memiliki stempel waktu syslog yang sama.
Definisi kolom:
abs
adalah waktu dicatat oleh syslog.
abs_since_boot
adalah waktu yang sama dalam hitungan detik sejak startup sistem, berdasarkan pada isi /proc/uptime
dan nilai time.time()
.
rel_time
adalah cap waktu kernel.
rel_offset
perbedaan antara abs_since_boot
dan rel_time
. Saya membulatkan ini ke puluhan detik untuk menghindari kesalahan satu kali karena syslog
cap waktu absolut (yaitu yang dihasilkan) hanya memiliki ketepatan detik. Itu sebenarnya bukan cara yang tepat untuk melakukannya, karena itu benar-benar (saya pikir ..) hanya menghasilkan peluang lebih kecil untuk memiliki kesalahan off-by-10. Jika seseorang memiliki ide yang lebih baik, beri tahu saya.
Saya juga memiliki beberapa pertanyaan tentang format tanggal syslog; khususnya, saya bertanya-tanya apakah setahun pernah muncul di dalamnya. Saya kira tidak, dan dalam hal apa pun kemungkinan besar bisa membantu diri saya sendiri untuk informasi itu di TFM, tetapi jika seseorang mengetahui hal itu akan berguna. ..Menganggap, tentu saja, bahwa seseorang menggunakan skrip ini di beberapa titik di masa depan, bukan hanya menerobos beberapa baris kode Perl.
Berikutnya:
Jadi, kecuali jika beberapa sambutan selamat datang kepada saya diberikan oleh salah satu dari Anda, langkah saya berikutnya adalah menambahkan fungsi untuk mendapatkan waktu yang miring untuk cap waktu kernel yang diberikan. Saya seharusnya dapat memberi makan script satu atau satu set syslog, bersama dengan cap waktu kernel, untuk mendapatkan cap waktu absolut. Lalu saya bisa kembali ke debugging masalah Xorg saya, yang melarikan diri saya saat ini.
sumber
sort
, memiliki tahun, zona waktu, dll. +1 untuk skrip python.Freezing user space processes
yang jelas dilakukan sebelum tidur.[12345.6789]..
) yang dipancarkan oleh kernel, sehingga ia melakukan hal-hal dengan benar , tunduk pada masalah yang dibahas oleh komentar terakhir saya. Saya tidak yakin apa yang seharusnya dilakukan kernel di sini; itu tergantung pada apa cap waktu relatif startup yang dimaksudkan untuk menunjukkan. Waktu berjalan (sebagai lawan dari waktu sejak boot) mungkin bermakna dalam beberapa konteks. Saya kira idealnya akan ada catatan yang dapat diandalkan dari kedua nilai tersebut.Jawaban:
Masalah yang menarik, Tidak yakin saya pernah mencoba melakukan ini. Tapi saya perhatikan cap waktu yang Anda bicarakan dan saya selalu menganggapnya sebagai detik sejak bootup.
Di syslog yang saya miliki di server, saya punya:
Saya akan membayangkan ini cukup konsisten di antara kebanyakan distro Linux karena ini adalah kernel yang meludahkannya.
Dan di sini saya punya tanggal bersama dengan stempel waktu.
sumber
Anda bisa mencobanya:
Pertama, dapatkan stempel waktu dari file dmesg (asumsi saya adalah ini akan menjadi waktu dmesg 0). Anda akan menggunakannya
Anda dapat mengubah detik menjadi tanggal yang dapat dibaca oleh manusia
Jadi untuk melihat waktu acara yang dapat dibaca, tambahkan detik dari acara di dmesg. Jika acara dmesg adalah 55.290387 detik, tambahkan 55 atau 55.290387:
Cara lain untuk mengubah detik berakar zaman menjadi waktu yang dapat dibaca adalah dengan menggunakan tanggal -d seperti yang disarankan. Jika Anda memberi tahu 'tanggal' untuk mewakili waktu yang diberikan dengan -d, Anda dapat menunjukkan bahwa waktu yang akan dikonversi adalah dalam detik-sejak-zaman-dengan menggunakan @.
Ini memberi Anda sesuatu seperti "Kamis 13 Jan 15:26:18 CST 2011" sebagai output.
akan mencetak waktu saat ini dalam format detik sejak zaman.Saya tidak ingat bagaimana melakukan shell matematika, jadi saya biasanya menggunakan metode perl seperti di atas. :)
sumber
date -d @$((1294953978 + 55))
, setidaknya di bawah bash. Namun, beberapa cap waktu kernel miring, yang berarti bahwa waktu yang dihasilkan oleh metode ini akan lebih awal dari cap waktu yang sesuai di/var/log/syslog
. Sepertinya ini terjadi sebagai akibat dari peristiwa suspend-to-RAM, mungkin di samping hibernasi dan mungkin beberapa hal lainnya, karena waktu kernel tidak bertambah selama periode tersebut. Lihat pembaruan pertanyaan untuk info lebih lanjut.Cara termudah untuk memetakan nomor dari dmesg ke tanggal adalah menggunakan
date
program.Perintah ini menampilkan tanggal untuk waktu saat ini minus 50595 detik.
Dari
man date
:Jumlahnya sama dengan waktu dihidupkan, bukan waktu yang berlalu sejak waktu boot.
sumber
Karena Anda mencatat waktu condong berubah selama penangguhan / resume, saya perhatikan ini didokumentasikan di setidaknya satu tempat. Halaman manual dmesg (1) mengatakan:
Saya tidak dapat menemukan cara untuk membuat kernel menjaga cap waktu ini tetap sinkron dengan waktu dinding.
sumber
Cepat, kotor, berhasil.
Isi skrip itu:
Output sampel adalah sebagai berikut:
sumber