Dmesg zaman damgalı Linux Centos


15

Centos 5.x dmesg'imi zaman damgası ile okumak istiyorum, bunu nasıl yaparım?


daha sonra dmesg -T bayrağını destekler, belki dmesg destekliyorsa -T'yi kullanmayı deneyin.
ilansch

centos 7+ destekleridmesg -T
rogerdpack

Yanıtlar:


12

dmesgÇekirdek günlük halkası arabelleğini okur. Zaman damgaları yapmaz. Yapmanız gereken, syslog'u çekirdek günlüklerini bu arabellekten almak ve bir dosyaya göndermek için yapılandırmaktır (zaten ayarlanmamışsa). Not, varsayılan CentOS 5.x syslog config /var/log/messageshatırladığım gibi, çekirdek günlüklerini gönderir .

Tüm çekirdek (dmesg) günlüklerini /var/log/kern.logvarsayılan syslog arka plan programını kullanarak göndermek isterseniz, aşağıdakine benzer bir satır eklersiniz./etc/syslog.conf

kern.*                         /var/log/kern.log

4
Cevap için teşekkür ederim. CentOS 6 çalıştıran arayan herkes için buldum/etc/rsyslog.conf
Safado

Evet, CentOS (ve RHEL) 6.x ile varsayılan syslog arka plan programını eski sysklogd'dan rsyslog'a değiştirdiler. RHEL / CentOS 5.x için de (desteklenen) bir paket olarak mevcuttur.
Christopher Cashell

1
Bunu çözmem gereken şeyler listemde buldum, ama şimdi bana biraz googling
kazandın

8

"Dmesg / Kernel Ring Buffer için Zaman Damgalarını Etkinleştirme" çözümü var

Şunları ekleyebilirsiniz:

printk.time=1

çekirdek cmdline.

Bana gelince, kuklalı tüm makinelerde rc.local'a ekledim. Benim için daha kolay):

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

benim için çalışıyor
c4f4t0r

5
Kullanımı rc.localbunun için gerçekten çirkin bir çözümdür (kullanmak rc.localneredeyse her şeye çirkin bir çözümdür). Daha iyi bir çözüm, printk.time = 1içine /etc/sysctl.confdosya koymak /etc/sysctl.d/. Bu dosyaların var olmasının nedeni budur. Bir şeyleri içine sokmak rc.local, sonunda sizi kırılgan, kıvrık, dağınık, güvenilir olmayan bir başlangıçla bırakacaktır.
Christopher Cashell

@ChristopherCashell'den gelen yorumda bu soruya verilen tek doğru cevap. Gerçek cevap değil, çok yazık.
Petr

1

Bu basit senaryoyu yazdım. Evet, yavaş. Daha hızlı bir şey istiyorsanız, perl, python veya başka bir şey üzerine bir komut dosyası yazabilirsiniz. Eminim bu basit script nasıl hesaplanabilir asmak verebilir.

Lütfen her satıra kaydedilen saniye bölümünü (zaman damgasındaki. İşaretinden sonra) yok saydığımı unutmayın.

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

Umut ediyorum bu yardım eder. :)


0

Durum satırında komut dosyası değişikliği "[" ile başlamıyor

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

Bu, Plutoid'in önerisiyle ilgili bir güncellemedir ve önde gelen alanları zaman damgasından kaldırır.

dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/( *)(\d+)\.\d+/localtime($2 + $a)/e; print $_;' 
  • perl -n, standart girdiyi okumak ve $ _ değişkenine okumak için bir yoldur.
  • Daha sonra gövde (BEGIN bölümü değil) her satır için bir kez çalıştırılır.
  • BEGIN kodu {} içinde bir kez çalıştırır.
  • $ a çağdan beri dmesg başlangıcıdır (saniye)
  • S / ... komutu $ _ içindeki değeri alır ve zaman damgasının \ s * #####. ###### bölümünü, dmesg ofsetinin ($ 1) eklenen dmesg ofsetinin ($ 1) ile değiştirir sistem başlangıç ​​zamanı ($ a)
  • $ a yazdır dmesg'i "önyüklemeden bu yana saniye" zaman damgası yerine yerel ayar zaman damgasıyla yazdırır.

1
Ve orijinal cevap gibi, biraz açıklanması gerekiyor. Yayınınızı düzenleyebilir, parçalayabilir ve adım atabilir misiniz?
Cory Knutson

-1

Aşağıdaki gibi küçük bir perl betiği. Bu genel bir yol ve ben yazar değilim.

dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/(\d+)\.\d+/localtime($1 + $a)/e; print $_;'
  • perl -n standart girdiyi okumak ve $ _ değişkenine okumak için bir yoldur.
  • Daha sonra gövde (BEGIN bölümü değil) her satır için bir kez çalıştırılır.
  • BEGIN kodu {} içinde bir kez çalıştırır.
  • $ a, çağdan beri dmesg'in başlangıcıdır
  • S / ... komutu, $ _ değerini alır ve zaman damgasının #####. ###### bölümünü, sistem başlangıcına eklenen dmesg ofsetinin ($ 1) "localtime" sürümüyle değiştirir zaman ($ a)
  • $ a yazdır dmesg'i "önyüklemeden bu yana saniye" zaman damgası yerine yerel ayar zaman damgasıyla yazdırır.

1
Bu cevabın biraz daha açıklanması gerekiyor.
kasperd

@kasperd Bu şu anlama gelir: - perl -n, standart girdiyi okumak ve $ _ değişkenine okumak için bir yoldur. Daha sonra gövde (BEGIN bölümü değil) her satır için bir kez çalıştırılır. - BEGIN kodu {} içinde bir kez çalıştırır. $ a çağdan beri dmesg başlangıcıdır - s/...Komut $ _ içindeki değeri alır ve zaman damgasının #####. ###### bölümünü dmesg ofsetinin "localtime" sürümüyle değiştirir ($ 1 ) sistem başlangıç ​​zamanına eklendi ($ a). - print $a"açılıştan bu yana saniye" zaman damgası yerine yerel dostu zaman damgası ile dmesg yazdırır.
dadinck
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.