Linux Centos พร้อมการประทับเวลา dmesg


15

ฉันต้องการอ่าน Centos 5.x dmesg ของฉันด้วย timestamp ฉันจะทำสิ่งนี้ได้อย่างไร


ในภายหลัง dmesg สนับสนุนแฟล็ก -T อาจลองใช้ -T หาก dmesg ของคุณรองรับ
ilansch

dmesg -T
Centos

คำตอบ:


12

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

4
ขอบคุณสำหรับคำตอบ สำหรับใครที่กำลังใช้งาน CentOS 6 ฉันพบมันใน/etc/rsyslog.conf
Safado

ใช่ด้วย CentOS (และ RHEL) 6.x พวกเขาเปลี่ยน syslog daemon เริ่มต้นจาก sysklogd เก่าเป็น rsyslog มีให้ใช้งานเป็นแพ็คเกจ (รองรับ) สำหรับ RHEL / CentOS 5.x เช่นกัน
Christopher Cashell

1
ดีฉันมีสิ่งนี้ในรายการสิ่งที่ฉันจะคิดออก แต่ตอนนี้คุณได้ช่วยฉัน googling
Safado

8

มีวิธีแก้ปัญหา "การเปิดใช้งานการประทับเวลาสำหรับ 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

ที่เหมาะกับฉัน
c4f4t0r

5
การใช้rc.localเป็นวิธีการแก้ปัญหาที่น่าเกลียดสำหรับสิ่งนี้ (การใช้rc.localนั้นเป็นวิธีแก้ปัญหาที่น่าเกลียดสำหรับทุกสิ่ง) วิธีการแก้ปัญหาที่ดีกว่าจะนำprintk.time = 1เข้าหรือแฟ้มใน/etc/sysctl.conf /etc/sysctl.d/นั่นคือเหตุผลที่ไฟล์เหล่านี้มีอยู่ การยัดเยียดสิ่งต่าง ๆ ลงไปrc.localในที่สุดจะทำให้คุณมีจุดเริ่มต้นที่เปราะบางซับซ้อนสับสนและไม่น่าเชื่อถือ
Christopher Cashell

นี่คือสิ่งที่อยู่ในความคิดเห็นจาก @ChristopherCashell เป็นเพียงคำตอบที่ถูกต้องสำหรับคำถามนี้ น่าเสียดายที่ไม่ใช่คำตอบที่แท้จริง
Petr

1

ฉันเขียนสคริปต์ง่าย ๆ นี้ ใช่มันช้า ถ้าคุณต้องการบางสิ่งที่เร็วกว่าคุณเขียนสคริปต์บน 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

ฉันหวังว่ามันจะช่วย :)


0

การแก้ไขสคริปต์ในกรณีที่บรรทัดไม่ได้เริ่มต้นด้วย "["

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

นี่คือการอัปเดตตามคำแนะนำของ Plutoid โดยลบช่องว่างนำออกจากการประทับเวลา

dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/( *)(\d+)\.\d+/localtime($2 + $a)/e; print $_;' 
  • perl -n เป็นวิธีการอ่านอินพุตมาตรฐานและอ่านเป็นตัวแปร $ _
  • เนื้อความ (ไม่ใช่ส่วน BEGIN) จะถูกเรียกใช้หนึ่งครั้งสำหรับแต่ละบรรทัด
  • BEGIN รันโค้ดใน {} หนึ่งครั้ง
  • $ a คือจุดเริ่มต้นของ dmesg ตั้งแต่ยุค (วินาที)
  • คำสั่ง s / ... ใช้ค่าเป็น $ _ และแทนที่ส่วน \ s * #####. ###### ส่วนของเวลาประทับที่มี "localtime" เวอร์ชันของ dmesg offset ($ 1) เพิ่มเข้าไป เวลาเริ่มต้นของระบบ ($ a)
  • พิมพ์ $ a พิมพ์ dmesg ด้วยการประทับเวลาที่เป็นมิตรกับโลแคลแทน "วินาทีตั้งแต่บูต"

1
และเช่นเดียวกับคำตอบดั้งเดิมมันต้องการคำอธิบายบางอย่าง คุณสามารถแก้ไขโพสต์ทำลายมันและก้าวผ่านมันได้หรือไม่
Cory Knutson

-1

สคริปต์ Perl เล็กน้อยดังต่อไปนี้ เป็นวิธีทั่วไปและฉันไม่ใช่ผู้เขียน

dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/(\d+)\.\d+/localtime($1 + $a)/e; print $_;'
  • perl -n เป็นวิธีในการอ่านอินพุตมาตรฐานและอ่านเป็นตัวแปร $ _
  • เนื้อความ (ไม่ใช่ส่วน BEGIN) จะถูกเรียกใช้หนึ่งครั้งสำหรับแต่ละบรรทัด
  • BEGIN รันโค้ดใน {} หนึ่งครั้ง
  • $ a คือจุดเริ่มต้นของ dmesg ตั้งแต่ยุค
  • คำสั่ง s / ... รับค่าเป็น $ _ และทดแทนส่วน #####. เวลา ($ a)
  • พิมพ์ $ a พิมพ์ dmesg ด้วยการประทับเวลาที่เป็นมิตรกับโลแคลแทน "วินาทีตั้งแต่บูต"

1
คำตอบนี้ต้องการคำอธิบายเพิ่มเติม
kasperd

@kasperd นี่คือความหมาย: - perl -n เป็นวิธีอ่านอินพุตมาตรฐานและอ่านเป็นตัวแปร $ _ เนื้อความ (ไม่ใช่ส่วน BEGIN) จะถูกเรียกใช้หนึ่งครั้งสำหรับแต่ละบรรทัด - BEGIN รันโค้ดใน {} หนึ่งครั้ง $ a คือจุดเริ่มต้นของ dmesg ตั้งแต่ยุค - s/...คำสั่งใช้ค่าใน $ _ และทดแทนส่วน #####. ###### ส่วนของการประทับเวลาด้วยเวอร์ชัน "localtime" ของ offset dmesg ($ 1 ) เพิ่มเข้ากับเวลาเริ่มต้นของระบบ ($ a) - print $aพิมพ์ dmesg ด้วยการประทับเวลาที่เป็นมิตรกับโลแคลแทน "วินาทีตั้งแต่บูต" การประทับเวลา
dadinck
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.