ฉันต้องการอ่าน Centos 5.x dmesg ของฉันด้วย timestamp ฉันจะทำสิ่งนี้ได้อย่างไร
dmesg -T
ฉันต้องการอ่าน Centos 5.x dmesg ของฉันด้วย timestamp ฉันจะทำสิ่งนี้ได้อย่างไร
dmesg -T
คำตอบ:
dmesg
อ่านบัฟเฟอร์ล็อกเคอร์เนลเคอร์เนล มันไม่ได้บันทึกเวลา สิ่งที่คุณควรทำคือกำหนดค่า syslog เพื่อดึงล็อกเคอร์เนลจากบัฟเฟอร์นั้นและส่งไปยังไฟล์ (หากยังไม่ได้ตั้งค่าให้ทำ) หมายเหตุค่าเริ่มต้น CentOS 5.x syslog config ส่งเคอร์เนลไป/var/log/messages
ที่ฉันจำได้
หากคุณต้องการส่งบันทึกเคอร์เนล (dmesg) /var/log/kern.log
ทั้งหมดโดยใช้ syslog daemon เริ่มต้นคุณจะต้องเพิ่มบรรทัดดังนี้/etc/syslog.conf
kern.* /var/log/kern.log
/etc/rsyslog.conf
มีวิธีแก้ปัญหา "การเปิดใช้งานการประทับเวลาสำหรับ dmesg / Kernel Ring Buffer"
คุณสามารถเพิ่ม:
printk.time=1
ถึงเคอร์เนล cmdline
สำหรับฉันฉันได้เพิ่ม rc.local ในทุกเครื่องที่มีหุ่นเชิด มันง่ายสำหรับฉัน):
if test -f /sys/module/printk/parameters/time; then
echo 1 > /sys/module/printk/parameters/time
fi
rc.local
เป็นวิธีการแก้ปัญหาที่น่าเกลียดสำหรับสิ่งนี้ (การใช้rc.local
นั้นเป็นวิธีแก้ปัญหาที่น่าเกลียดสำหรับทุกสิ่ง) วิธีการแก้ปัญหาที่ดีกว่าจะนำprintk.time = 1
เข้าหรือแฟ้มใน/etc/sysctl.conf
/etc/sysctl.d/
นั่นคือเหตุผลที่ไฟล์เหล่านี้มีอยู่ การยัดเยียดสิ่งต่าง ๆ ลงไปrc.local
ในที่สุดจะทำให้คุณมีจุดเริ่มต้นที่เปราะบางซับซ้อนสับสนและไม่น่าเชื่อถือ
ฉันเขียนสคริปต์ง่าย ๆ นี้ ใช่มันช้า ถ้าคุณต้องการบางสิ่งที่เร็วกว่าคุณเขียนสคริปต์บน perl, python หรืออย่างอื่น ฉันแน่ใจว่าสคริปต์แบบง่ายนี้สามารถให้คุณทราบถึงวิธีการคำนวณ
โปรดทราบฉันไม่สนใจเศษเสี้ยววินาทีที่ลงทะเบียนในแต่ละบรรทัด (หลัง. ในการประทับเวลา)
#!/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
ฉันหวังว่ามันจะช่วย :)
การแก้ไขสคริปต์ในกรณีที่บรรทัดไม่ได้เริ่มต้นด้วย "["
#!/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
นี่คือการอัปเดตตามคำแนะนำของ Plutoid โดยลบช่องว่างนำออกจากการประทับเวลา
dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/( *)(\d+)\.\d+/localtime($2 + $a)/e; print $_;'
สคริปต์ Perl เล็กน้อยดังต่อไปนี้ เป็นวิธีทั่วไปและฉันไม่ใช่ผู้เขียน
dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/(\d+)\.\d+/localtime($1 + $a)/e; print $_;'
perl -n
เป็นวิธีในการอ่านอินพุตมาตรฐานและอ่านเป็นตัวแปร $ _s/...
คำสั่งใช้ค่าใน $ _ และทดแทนส่วน #####. ###### ส่วนของการประทับเวลาด้วยเวอร์ชัน "localtime" ของ offset dmesg ($ 1 ) เพิ่มเข้ากับเวลาเริ่มต้นของระบบ ($ a) - print $a
พิมพ์ dmesg ด้วยการประทับเวลาที่เป็นมิตรกับโลแคลแทน "วินาทีตั้งแต่บูต" การประทับเวลา