Saya ingin membaca Centos 5.x dmesg saya dengan stempel waktu, bagaimana saya melakukan ini?
dmesg -T
Saya ingin membaca Centos 5.x dmesg saya dengan stempel waktu, bagaimana saya melakukan ini?
dmesg -T
Jawaban:
dmesg
membaca 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
/etc/rsyslog.conf
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
rc.local
benar-benar semacam solusi buruk untuk ini (menggunakan rc.local
hampir selalu merupakan solusi buruk untuk apa pun). Sebuah solusi yang lebih baik akan menempatkan printk.time = 1
ke dalam /etc/sysctl.conf
atau file dalam /etc/sysctl.d/
. Itulah alasan file-file ini ada. Menjejalkan hal-hal pada rc.local
akhirnya akan meninggalkan Anda dengan start-up yang rapuh, berbelit-belit, berantakan, tidak dapat diandalkan.
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. :)
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
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 $_;'
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 $ _.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 $a
mencetak dmesg dengan cap waktu ramah lokal yang diganti dengan cap waktu "detik sejak booting".