Linux Centos dengan cap waktu dmesg


15

Saya ingin membaca Centos 5.x dmesg saya dengan stempel waktu, bagaimana saya melakukan ini?


nanti dmesg mendukung flag -T, mungkin coba gunakan -T jika dmesg Anda mendukungnya.
ilansch

centos 7+ mendukungdmesg -T
rogerdpack

Jawaban:


12

dmesgmembaca buffer ring log Kernel. Itu tidak melakukan cap waktu. Yang harus Anda lakukan adalah mengkonfigurasi syslog untuk mengambil log kernel dari buffer itu dan mengirimkannya ke file (jika belum diatur untuk melakukannya). Catatan, default CentOS 5.x syslog config mengirimkan log kernel ke /var/log/messages, seingat saya.

Jika Anda ingin mengirim semua log kernel (dmesg) ke /var/log/kern.log, menggunakan daemon syslog default, Anda akan menambahkan baris seperti berikut ke/etc/syslog.conf

kern.*                         /var/log/kern.log

4
Terima kasih atas jawabannya. Bagi siapa pun yang mencari yang menjalankan CentOS 6, saya menemukannya di/etc/rsyslog.conf
Safado

Yap, dengan CentOS (dan RHEL) 6.x, mereka mengubah daemon syslog default dari sysklogd lama menjadi rsyslog. Ini tersedia sebagai paket (didukung) untuk RHEL / CentOS 5.x juga.
Christopher Cashell

1
Yah, saya sudah memiliki ini dalam daftar hal untuk mencari tahu, tapi sekarang Anda telah menyelamatkan saya beberapa googling
Safado

8

Ada solusi "Mengaktifkan Stempel Waktu untuk dmesg / Kernel Ring Buffer"

Anda bisa menambahkan:

printk.time=1

ke cmdline kernel.

Sedangkan saya, saya telah menambahkan ke rc.local di semua mesin dengan boneka. Lebih mudah bagi saya):

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

yang bekerja untuk saya
c4f4t0r

5
Menggunakan rc.localbenar-benar semacam solusi buruk untuk ini (menggunakan rc.localhampir selalu merupakan solusi buruk untuk apa pun). Sebuah solusi yang lebih baik akan menempatkan printk.time = 1ke dalam /etc/sysctl.confatau file dalam /etc/sysctl.d/. Itulah alasan file-file ini ada. Menjejalkan hal-hal pada rc.localakhirnya akan meninggalkan Anda dengan start-up yang rapuh, berbelit-belit, berantakan, tidak dapat diandalkan.
Christopher Cashell

Ini yang ada di komentar dari @ChristopherCashell adalah satu-satunya jawaban yang benar untuk pertanyaan ini. Sayang itu bukan jawaban yang sebenarnya.
Petr

1

Saya sudah menulis skrip sederhana ini. Ya, lambat. Jika Anda menginginkan sesuatu yang lebih cepat, Anda sebenarnya menulis skrip di perl, python, atau yang lainnya. Saya yakin skrip sederhana ini dapat memberi Anda pemahaman tentang cara penghitungannya.

Harap perhatikan bahwa saya mengabaikan fraksi detik yang terdaftar di setiap baris (setelah. Di stempel waktu).

#!/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

Saya harap ini membantu. :)


0

Modifikasi skrip pada baris kasus tidak dimulai dengan "["

#!/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

Ini adalah pembaruan atas saran Plutoid, menghilangkan spasi utama dari cap waktu.

dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/( *)(\d+)\.\d+/localtime($2 + $a)/e; print $_;' 
  • perl -n adalah cara untuk membaca input standar dan membaca ke dalam variabel $ _.
  • Tubuh (bukan bagian BEGIN) kemudian dijalankan sekali untuk setiap baris.
  • BEGIN menjalankan kode dalam {} satu kali.
  • $ a adalah awal dari dmesg sejak zaman (detik)
  • Perintah s / ... mengambil nilai dalam $ _ dan mengganti bagian \ s * #####. ###### dari timestamp dengan versi "localtime" dari offset dmesg ($ 1) ditambahkan ke waktu mulai sistem ($ a)
  • print $ a mencetak dmesg dengan cap waktu ramah lokal yang diganti dengan cap waktu "detik sejak booting".

1
Dan seperti jawaban aslinya, perlu beberapa penjelasan. Bisakah Anda mengedit posting Anda, memecahnya, dan melangkah melaluinya?
Cory Knutson

-1

Script perl kecil seperti di bawah ini. Ini cara umum, dan saya bukan penulisnya.

dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/(\d+)\.\d+/localtime($1 + $a)/e; print $_;'
  • perl -n adalah cara untuk membaca input standar dan membaca ke dalam variabel $ _.
  • Tubuh (bukan bagian BEGIN) kemudian dijalankan sekali untuk setiap baris.
  • BEGIN menjalankan kode dalam {} satu kali.
  • $ a adalah awal dari dmesg sejak zamannya
  • Perintah s / ... mengambil nilai dalam $ _ dan mengganti bagian #####. ###### bagian dari timestamp dengan versi "localtime" dari offset dmesg ($ 1) ditambahkan ke sistem start waktu ($ a)
  • print $ a mencetak dmesg dengan cap waktu ramah lokal yang diganti dengan cap waktu "detik sejak booting".

1
Jawaban ini perlu penjelasan lebih lanjut.
kasperd

@kasperd Inilah artinya: - perl -n adalah cara untuk membaca input standar dan membaca variabel $ _. Tubuh (bukan bagian BEGIN) kemudian dijalankan sekali untuk setiap baris. - BEGIN menjalankan kode dalam {} satu kali. $ a adalah awal dari dmesg sejak zaman - s/...Perintah mengambil nilai dalam $ _ dan mengganti bagian #####. ###### dari cap waktu dengan versi "localtime" dari offset dmesg ($ 1 ) ditambahkan ke waktu mulai sistem ($ a). - print $amencetak dmesg dengan cap waktu ramah lokal yang diganti dengan cap waktu "detik sejak booting".
dadinck
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.