कस्टम तिथि प्रारूप में dmesg टाइमस्टैम्प परिवर्तित करें


111

मैं dmesg टाइमस्टैम्प को समझने की कोशिश कर रहा हूं और इसे परिवर्तित करने के लिए इसे java date / custom date format में बदलना मुश्किल है।

किसी भी प्रकार की मदद की बेहद सराहना की जाती है।

नमूना dmesg लॉग:

[14614.647880] airo(eth1): link lost (missed beacons)

धन्यवाद!

जवाबों:


179

dmesgटाइमस्टैम्प को समझना बहुत आसान है: कर्नेल शुरू होने के बाद से सेकंड में समय है। इसलिए, स्टार्टअप के समय ( uptime), आप सेकंड जोड़ सकते हैं और उन्हें जो भी स्वरूप आपको पसंद है, में दिखा सकते हैं।

या बेहतर, आप मानव पठनीय प्रारूप के -Tकमांड लाइन विकल्प का उपयोग कर सकते हैं dmesg

से आदमी पेज :

-T, --ctime
    Print human readable timestamps. The timestamp could be inaccurate!

    The time source used for the logs is not updated after system SUSPEND/RESUME.

10
क्या कमांड स्वीकार करता है -टी? मेरा dmesg नहीं करता है, न ही मैनपेज इसे बताता है। (लिनक्स मिंट डेबियन संस्करण)।
8::३४:३४ पर ज्योर्तिग्रहम

1
खान करता है ( Ubuntu 13.04 dmesgसे util-linux 2.20.1नीचे)

2
Redhat और / oracle linux 5.6 में उपलब्ध नहीं है, rpm -qf /bin/dmesg => util-linux-2.13-0.56.0.2.el5
माइकल

7
util-linux 2.20रिलीज़ नोट्स के अनुसार यह विकल्प दिखाई दिया : ftp.kernel.org/pub/linux/utils/util-linux/v2.20/…
ks1322

1
@ उत्थान के लिए धन्यवाद, यह आपके लिए अच्छा है :) सवाल के बारे में, मुझे लगता है कि समझ हिस्सा मामूली है और "इसे जावा तिथि / कस्टम तिथि प्रारूप में बदलने के लिए परिवर्तित करें।" मुख्य हिस्सा था, लेकिन आपकी राय अलग हो सकती है। आपका दिन शुभ हो;)

32

डॉ उत्तर की मदद से , मैंने एक वर्कअराउंड लिखा जो आपके .bashrc में डालने के लिए रूपांतरण करता है। अगर आपके पास टाइमस्टैम्प नहीं है या पहले से ही सही टाइमस्टैम्प नहीं है तो यह कुछ भी नहीं तोड़ेगा।

dmesg_with_human_timestamps () {
    $(type -P dmesg) "$@" | perl -w -e 'use strict;
        my ($uptime) = do { local @ARGV="/proc/uptime";<>}; ($uptime) = ($uptime =~ /^(\d+)\./);
        foreach my $line (<>) {
            printf( ($line=~/^\[\s*(\d+)\.\d+\](.+)/) ? ( "[%s]%s\n", scalar localtime(time - $uptime + $1), $2 ) : $line )
        }'
}
alias dmesg=dmesg_with_human_timestamps

इसके अलावा, Dmesg टाइमस्टैम्प रूपांतरण तर्क पर एक अच्छी रीडिंग और जब कोई नहीं हो तो टाइमस्टैम्प कैसे सक्षम करें : https://supportcenter.checkpoint.com/supportcenter/portal?eventSubmit_doGoviewsolutiondetails=&solutionid=sk92677


मामूली सुधार: आप पाइप लाइन में 'टेल -1' को हटा सकते हैं और बस जाग लाइनों को खाने दें और इसके बफर में अंतिम लाइन से प्रिंट करें। local dmesg_bin=$(type -a dmesg | awk 'END { print $NF }')
ब्रायन ओन

@ लुकास: क्या आप $ (जो dmesg) के बजाय 'type -a dmesg | ...' का उपयोग करके समझा सकते हैं? क्या उस पथ को प्राप्त करने के लिए 3-स्टेज पाइप का एक फायदा है?
१०:२

@Stabledog: अच्छा सवाल। typeओवर का उपयोग क्यों कर रहे हैं which, इस प्रश्न के लिए , इस प्रश्न को देखें । मैंने हालांकि बेकार ट्रिपल पाइप से बचने के लिए अपना जवाब संपादित किया।
लुकास किमोन

इस बैश / पर्ल स्निपेट ने मेरे लिए काम किया, मेरे पास एक पुरानी RHEL5.7 मशीन है जिसकी मुझे देखभाल करनी है और dmesg के पास मानव समय में टाइमस्टैम्प प्रिंट करने का कोई विकल्प नहीं है।
पॉल एम।

17

"Dmesg -T" जैसे कि RHEL / CentOS 6 के बिना सिस्टम के लिए, मुझे "dmesg_with_human_timestamps" फ़ंक्शन पसंद आया, जो पहले लुकास-साइमन द्वारा प्रदान किया गया था। यह हमारे बड़े बक्से के साथ कुछ बक्से के साथ थोड़ी परेशानी है, हालांकि। यह बताता है कि dmesg में कर्नेल टाइमस्टैम्प व्यक्तिगत सीपीयू द्वारा रखे गए अपटाइम मान से प्राप्त होते हैं। समय के साथ यह वास्तविक समय घड़ी के साथ सिंक से बाहर हो जाता है। नतीजतन, हाल ही में dmesg प्रविष्टियों के लिए सबसे सटीक रूपांतरण सीपीयू घड़ी के बजाय / खरीद / अपटाइम पर आधारित होगा। उदाहरण के लिए, यहां एक विशेष CentOS 6.6 बॉक्स पर:

# grep "\.clock" /proc/sched_debug  | head -1
  .clock                         : 32103895072.444568
# uptime
 15:54:05 up 371 days, 19:09,  4 users,  load average: 3.41, 3.62, 3.57
# cat /proc/uptime
32123362.57 638648955.00

सीपीयू अपटाइम के लिए मिलीसेकंड में होने के कारण, यहां लगभग 5 1/2 घंटे की भरपाई होती है। इसलिए मैंने स्क्रिप्ट को संशोधित किया और इसे प्रक्रिया में देशी बैश में बदल दिया:

dmesg_with_human_timestamps () {
    FORMAT="%a %b %d %H:%M:%S %Y"

    now=$(date +%s)
    cputime_line=$(grep -m1 "\.clock" /proc/sched_debug)

    if [[ $cputime_line =~ [^0-9]*([0-9]*).* ]]; then
        cputime=$((BASH_REMATCH[1] / 1000))
    fi

    dmesg | while IFS= read -r line; do
        if [[ $line =~ ^\[\ *([0-9]+)\.[0-9]+\]\ (.*) ]]; then
            stamp=$((now-cputime+BASH_REMATCH[1]))
            echo "[$(date +"${FORMAT}" --date=@${stamp})] ${BASH_REMATCH[2]}"
        else
            echo "$line"
        fi
    done
}

alias dmesgt=dmesg_with_human_timestamps

समारोह zsh में काम नहीं किया। उचित तरीके से इसे करना था। कहा कि, 221 दिनों के अपटाइम के साथ एक बॉक्स पर, इस समाधान में वास्तविक के मिनट तक का समय था। अन्य समाधानों ने मूल कारण घटना को दिन में 2+ घंटे पहले दिखाया। धन्यवाद, एलन। आपने मेरी दोपहर बचा ली।
ट्रेंटन

RHEL5.x मशीनें दिखाई नहीं देतीं / proc / schedule_debug :-(
पॉल एम

14

तो केवज़ेरो ने एक कम गुदगुदी समाधान का अनुरोध किया, इसलिए मैं निम्नलिखित के साथ आया:

sed -r 's#^\[([0-9]+\.[0-9]+)\](.*)#echo -n "[";echo -n $(date --date="@$(echo "$(grep btime /proc/stat|cut -d " " -f 2)+\1" | bc)" +"%c");echo -n "]";echo -n "\2"#e'

यहाँ एक उदाहरण है:

$ dmesg|tail | sed -r 's#^\[([0-9]+\.[0-9]+)\](.*)#echo -n "[";echo -n $(date --date="@$(echo "$(grep btime /proc/stat|cut -d " " -f 2)+\1" | bc)" +"%c");echo -n "]";echo -n "\2"#e'
[2015-12-09T04:29:20 COT] cfg80211:   (57240000 KHz - 63720000 KHz @ 2160000 KHz), (N/A, 0 mBm), (N/A)
[2015-12-09T04:29:23 COT] wlp3s0: authenticate with dc:9f:db:92:d3:07
[2015-12-09T04:29:23 COT] wlp3s0: send auth to dc:9f:db:92:d3:07 (try 1/3)
[2015-12-09T04:29:23 COT] wlp3s0: authenticated
[2015-12-09T04:29:23 COT] wlp3s0: associate with dc:9f:db:92:d3:07 (try 1/3)
[2015-12-09T04:29:23 COT] wlp3s0: RX AssocResp from dc:9f:db:92:d3:07 (capab=0x431 status=0 aid=6)
[2015-12-09T04:29:23 COT] wlp3s0: associated
[2015-12-09T04:29:56 COT] thinkpad_acpi: EC reports that Thermal Table has changed
[2015-12-09T04:29:59 COT] i915 0000:00:02.0: BAR 6: [??? 0x00000000 flags 0x2] has bogus alignment
[2015-12-09T05:00:52 COT] thinkpad_acpi: EC reports that Thermal Table has changed

यदि आप इसे थोड़ा बेहतर प्रदर्शन करना चाहते हैं, तो टाइमस्टैम्प को एक चर में बदले में खरीद लें :)


4

हाल के संस्करणों में, आप बस कॉल कर सकते हैं dmesg -T


3
तुम्हारा जवाब आरसी ने दो साल पहले ही दे दिया था।
जॉस

4

यदि आपके पास एंड्रॉइड पर उदाहरण के लिए -Tविकल्प नहीं है dmesg, तो आप busyboxसंस्करण का उपयोग कर सकते हैं । निम्नलिखित कुछ अन्य मुद्दों को भी हल करता है:

  1. [0.0000]प्रारूप कुछ गलत रंग जानकारी की तरह दिखता है, उपसर्गों चाहते कि से पहले किया जाता है <6>
  2. फ्लोट से पूर्णांक बनाएं।

यह इस ब्लॉग पोस्ट से प्रेरित है ।

#!/bin/sh                                                                                                               
# Translate dmesg timestamps to human readable format                                                                   

# uptime in seconds                                                                                                     
uptime=$(cut -d " " -f 1 /proc/uptime)                                                                                  

# remove fraction                                                                                                       
uptime=$(echo $uptime | cut -d "." -f1)                                                                                 

# run only if timestamps are enabled                                                                                    
if [ "Y" = "$(cat /sys/module/printk/parameters/time)" ]; then                                                          
  dmesg | sed "s/[^\[]*\[/\[/" | sed "s/^\[[ ]*\?\([0-9.]*\)\] \(.*\)/\\1 \\2/" | while read timestamp message; do      
    timestamp=$(echo $timestamp | cut -d "." -f1)                                                                       
    ts1=$(( $(busybox date +%s) - $uptime + $timestamp ))                                                               
    ts2=$(busybox date -d "@${ts1}")                                                                                    
    printf "[%s] %s\n" "$ts2" "$message"                                                                                
  done                                                                                                                  
else                                                                                                                    
  echo "Timestamps are disabled (/sys/module/printk/parameters/time)"                                                   
fi                                                                                                                      

हालाँकि, ध्यान दें कि यह कार्यान्वयन काफी धीमा है।


3

आपको "btime" को / proc / stat में संदर्भित करना होगा, जो कि यूनिक्स युग का समय है जब सिस्टम नवीनतम बूट किया गया था। तब आप उस सिस्टम बूट समय पर आधार बना सकते हैं और फिर प्रत्येक घटनाओं के लिए टाइमस्टैम्प की गणना करने के लिए dmesg में दिए गए बीता हुआ सेकंड को जोड़ सकते हैं।


3

पुराने Linux डिस्ट्रोस के साथ अभी तक एक और विकल्प रैपिंग स्क्रिप्ट का उपयोग करना है, उदाहरण के लिए पर्ल या पायथन में।

यहां देखें समाधान:

http://linuxaria.com/article/how-to-make-dmesg-timestamp-human-readable?lang=en http://jmorano.moretrix.com/2012/03/dmesg-human-readable-timestamps/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.