Damsg टाइमस्टैम्प के साथ लिनक्स सेंटोस


15

मैं टाइमस्टैम्प के साथ अपने Centos 5.x dmesg को पढ़ना चाहूँगा, मैं यह कैसे करूँ?


बाद में dmesg -T ध्वज का समर्थन करता है, शायद -T का उपयोग करने का प्रयास करें यदि आपका dmesg इसका समर्थन करता है।
इलेंश जूल

जवाबों:


12

dmesgकर्नेल लॉग रिंग बफर पढ़ता है। यह टाइमस्टैम्प नहीं करता है। आपको क्या करना चाहिए, उस बफर से कर्नेल लॉग को हथियाने के लिए syslog को कॉन्फ़िगर करें और उन्हें एक फ़ाइल पर भेजें (यदि ऐसा करने के लिए पहले से सेट नहीं है)। ध्यान दें, डिफ़ॉल्ट CentOS 5.x syslog विन्यास कर्नेल लॉग भेजता है /var/log/messages, जैसा कि मुझे याद है।

यदि आप /var/log/kern.logडिफ़ॉल्ट साइनसॉल डेमॉन का उपयोग करके सभी कर्नेल (dmesg) लॉग भेजना चाहते हैं, तो आप निम्न की तरह एक पंक्ति जोड़ेंगे/etc/syslog.conf

kern.*                         /var/log/kern.log

4
जवाब के लिए धन्यवाद। किसी के लिए देख रहा है कि CentOS 6 चल रहा है, मैंने इसे पाया/etc/rsyslog.conf
Safado

हां, CentOS (और RHEL) 6.x के साथ, उन्होंने पुराने sysklogd से rsyslog में डिफ़ॉल्ट syslog डेमॉन को बदल दिया। यह RHEL / CentOS 5.x के लिए (समर्थित) पैकेज के रूप में भी उपलब्ध है।
क्रिस्टोफर काशेल

1
ठीक है, मुझे यह पता लगाने के लिए मेरी चीजों की सूची पर था, लेकिन अब आपने मुझे कुछ गुगली बचाने के लिए बचा लिया है
Safado

8

वहाँ समाधान है "dmesg / कर्नेल रिंग बफर के लिए टाइमस्टैम्प सक्षम करना"

आप जोड़ सकते हैं:

printk.time=1

कर्नेल cmdline के लिए।

मेरे लिए, मैंने कठपुतली के साथ सभी मशीनों पर r.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अंत में आप एक नाजुक, दृढ़, गन्दा, अविश्वसनीय स्टार्ट-अप के साथ सामान को नष्ट कर देंगे।
क्रिस्टोफर कैशेल

यह @ChristopherCashell की टिप्पणी से है जो इस प्रश्न का एकमात्र सही उत्तर है। यह शर्म की बात है कि यह वास्तविक जवाब नहीं है।
पेट्र

1

मैंने यह सरल स्क्रिप्ट लिखी है। हां, यह धीमी है। यदि आप कुछ तेज चाहते हैं तो आप वास्तव में पर्ल, अजगर या कुछ और पर एक स्क्रिप्ट लिखेंगे। मुझे यकीन है कि यह सरल स्क्रिप्ट आपको यह बता सकती है कि इसकी गणना कैसे की जा सकती है।

कृपया ध्यान दें कि मैंने प्रत्येक पंक्ति में (टाइमस्टैम्प में) के बाद पंजीकृत सेकंड अंश को अनदेखा कर दिया है।

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

यह प्लूटॉइड के सुझाव पर एक अपडेट है, टाइमस्टैम्प से प्रमुख रिक्त स्थान को हटा रहा है।

dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/( *)(\d+)\.\d+/localtime($2 + $a)/e; print $_;' 
  • perl -n मानक इनपुट पढ़ने और चर $ _ में पढ़ने का एक तरीका है।
  • निकाय (BEGIN अनुभाग नहीं) प्रत्येक पंक्ति के लिए एक बार चलाया जाता है।
  • BEGIN एक बार {} में कोड चलाता है।
  • $ युग युग (सेकंड) के बाद से dmesg की शुरुआत है
  • S / ... कमांड $ _ में मान लेता है और \ _ * ##### का # टाइमस्टैम्प का "स्थानीय समय" संस्करण dmesg ऑफ़सेट के "लोकलटाइम" संस्करण ($ 1) के साथ जोड़ देता है। प्रणाली शुरू समय ($ एक)
  • $ $ प्रिंटों को लोकेल फ्रेंडली टाइम स्टैम्प के साथ "सेकंड चूंकि बूट" टाइम स्टैम्प के लिए प्रतिस्थापित किया जाता है।

1
और मूल उत्तर की तरह, इसे कुछ स्पष्टीकरण की आवश्यकता है। क्या आप अपनी पोस्ट को संपादित कर सकते हैं, इसे तोड़ सकते हैं, और इसके माध्यम से कदम बढ़ा सकते हैं?
कोरी नॉटसन

-1

नीचे के रूप में थोड़ा पर्ल स्क्रिप्ट। यह एक सामान्य तरीका है, और मैं लेखक नहीं हूँ।

dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/(\d+)\.\d+/localtime($1 + $a)/e; print $_;'
  • perl -n मानक इनपुट पढ़ने और चर $ _ में पढ़ने का एक तरीका है।
  • निकाय (BEGIN अनुभाग नहीं) प्रत्येक पंक्ति के लिए एक बार चलाया जाता है।
  • BEGIN एक बार {} में कोड चलाता है।
  • $ एक युग के बाद से dmesg की शुरुआत है
  • S / ... कमांड $ _ में वैल्यू लेता है और टाइमस्टैम्प के "लोकलटाइम" संस्करण के साथ टाइमस्टैम्प के "लोकलटाइम" वर्जन ($ 1) के साथ सिस्टम स्टार्ट में जोड़ा गया #####। ##### का विकल्प देता है। समय ($)
  • $ $ प्रिंटों को लोकेल फ्रेंडली टाइम स्टैम्प के साथ "सेकंड चूंकि बूट" टाइम स्टैम्प के लिए प्रतिस्थापित किया जाता है।

1
इस उत्तर को कुछ और स्पष्टीकरण की आवश्यकता है।
कैस्परड

@kasperd यहाँ इसका अर्थ है: - perl -n एक तरीका है जो मानक इनपुट को पढ़ता है और चर $ _ में पढ़ता है। शरीर (BEGIN अनुभाग नहीं) प्रत्येक पंक्ति के लिए एक बार चलाया जाता है। - BEGIN एक बार {} में कोड चलाता है। $ युग के बाद से dmesg की शुरुआत होती है - s/...कमांड $ _ में मूल्य लेता है और # dmesg ऑफ़सेट के "स्थानीय समय" संस्करण के साथ टाइमस्टैम्प के ##### # ##### भाग का विकल्प देता है ($ 1) ) सिस्टम स्टार्ट टाइम ($ a) में जोड़ा गया। - print $aलोकल फ्रेंडली टाइम स्टैम्प के साथ dmesg प्रिंट करता है जो "स्टॉक्स चूंकि बूट" टाइम स्टैम्प है।
डैडिनक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.