सहसंबंध / var / log / * टाइमस्टैम्प


20

/var/log/messages, /var/log/syslogऔर कुछ अन्य लॉग फ़ाइलों में टाइमस्टैम्प का उपयोग होता है, जिसमें एक पूर्ण समय होता है, जैसे Jan 13 14:13:10

/var/log/Xorg.0.logऔर /var/log/dmesg, साथ ही आउटपुट $ dmesg, एक प्रारूप का उपयोग करता है जो दिखता है

[50595.991610] malkovich: malkovich malkovich malkovich malkovich

मैं अनुमान लगा रहा / इकट्ठा कर रहा हूं कि संख्याएँ स्टार्टअप के बाद से सेकंड और माइक्रोसेकंड का प्रतिनिधित्व करती हैं।

हालाँकि, टाइमस्टैम्प के इन दो सेटों (से आउटपुट का उपयोग करके uptime) को सहसंबद्ध करने के मेरे प्रयास ने लगभग 5000 सेकंड की विसंगति दी।

यह लगभग उस समय की राशि है जब मेरे कंप्यूटर को निलंबित कर दिया गया था।

क्या damsg और Xorg द्वारा उपयोग किए गए संख्यात्मक टाइमस्टैम्प को पूर्ण टाइमस्टैम्प में मैप करने का एक सुविधाजनक तरीका है?

अपडेट करें

एक प्रारंभिक कदम के रूप में यह समझ में आ रहा है, और यह भी उम्मीद है कि मेरे सवाल को थोड़ा और स्पष्ट करने के लिए, मैंने समय को तिरछा करने और आउटपुट करने के लिए पायथन स्क्रिप्ट लिखी है /var/log/syslog। मेरी मशीन पर, ubuntu 10.10 चल रही है, उस फ़ाइल में कई कर्नेल-उत्पत्ति वाली लाइनें हैं, जो dmesg टाइमस्टैम्प और सिसलॉग टाइमस्टैम्प दोनों के साथ मुहर लगी हैं। स्क्रिप्ट उस फ़ाइल में प्रत्येक पंक्ति के लिए एक लाइन आउटपुट करती है जिसमें कर्नेल टाइमस्टैम्प होता है।

उपयोग:

python syslogdriver.py /var/log/syslog | column -nts $'\t'

अतिरंजित आउटपुट (स्तंभ परिभाषाओं के लिए नीचे देखें):

abs              abs_since_boot  rel_time      rel_offset  message
Jan 13 07:49:15  32842.1276569   32842.301498  0           malkovich malkovich

... rel_offsetसभी हस्तक्षेप करने वाली लाइनों के लिए 0 है ...

Jan 13 09:55:14  40401.1276569   40401.306386  0           PM: Syncing filesystems ... done.
Jan 13 09:55:14  40401.1276569   40401.347469  0           PM: Preparing system for mem sleep
Jan 13 11:23:21  45688.1276569   40402.128198  -5280       Skipping EDID probe due to cached edid
Jan 13 11:23:21  45688.1276569   40402.729152  -5280       Freezing user space processes ... (elapsed 0.03 seconds) done.
Jan 13 11:23:21  45688.1276569   40402.760110  -5280       Freezing remaining freezable tasks ... (elapsed 0.01 seconds) done.
Jan 13 11:23:21  45688.1276569   40402.776102  -5280       PM: Entering mem sleep

... rel_offsetसभी शेष लाइनों के लिए -5280 है ...

Jan 13 11:23:21  45688.1276569   40403.149074  -5280       ACPI: Preparing to enter system sleep state S3
Jan 13 11:23:21  45688.1276569   40403.149477  -5280       PM: Saving platform NVS memory
Jan 13 11:23:21  45688.1276569   40403.149495  -5280       Disabling non-boot CPUs ...
Jan 13 11:23:21  45688.1276569   40403.149495  -5280       Back to C!
Jan 13 11:23:21  45688.1276569   40403.149495  -5280       PM: Restoring platform NVS memory
Jan 13 11:23:21  45688.1276569   40403.151034  -5280       ACPI: Waking up from system sleep state S3

... अंतिम लाइनें थोड़ा और नीचे से हैं, फिर भी आउटपुट के अंत में अच्छी तरह से ऊपर हैं। संभवतः उनमें से कुछ को dmesgनिलंबित होने से पहले परिपत्र बफ़र के लिए लिखा गया था, और केवल syslogबाद में प्रचारित किया गया था। यह बताता है कि क्यों सभी के पास एक ही syslog टाइमस्टैम्प है।

स्तंभ परिभाषाएँ:

abs syslog द्वारा लॉग इन किया गया समय है।

abs_since_bootकी सामग्री /proc/uptimeऔर मूल्य के आधार पर सिस्टम स्टार्टअप के बाद से सेकंड में वही समय है time.time()

rel_time कर्नेल टाइमस्टैम्प है।

rel_offsetके बीच अंतर है abs_since_bootऔर rel_time। मैं सेकंड के दसियों के लिए इसे राउंड कर रहा हूं ताकि पूर्ण (यानी syslog-रंजित) टाइमस्टैम्प के कारण केवल एक सेकंड में होने वाली त्रुटियों से बचा जा सके । यह वास्तव में ऐसा करने का सही तरीका नहीं है, क्योंकि यह वास्तव में है (मुझे लगता है ..) केवल एक ऑफ-बाय -10 त्रुटि होने का एक छोटा मौका देता है। अगर किसी के पास बेहतर विचार है, तो कृपया मुझे बताएं।

मेरे पास syslog की दिनांक प्रारूप के बारे में कुछ प्रश्न हैं; विशेष रूप से, मैं सोच रहा था कि क्या एक साल कभी इसमें दिखाई देगा। मैं अनुमान लगा रहा हूं कि नहीं, और किसी भी स्थिति में टीएफएम में उस जानकारी के लिए खुद को सबसे अधिक मदद मिल सकती है, लेकिन अगर किसी को पता चलता है तो यह उपयोगी होगा। .., निश्चित रूप से, कि कोई इस लिपि का उपयोग भविष्य में किसी बिंदु पर करता है, बजाय इसके कि पर्ल कोड की कुछ पंक्तियों को तोड़ दिया जाए।

आगे:

इसलिए जब तक कि आप में से किसी के द्वारा आपका स्वागत नहीं किया जाता है, मेरा अगला कदम एक दिए गए कर्नेल टाइमस्टैम्प के लिए समय तिरछा पाने के लिए एक फ़ंक्शन जोड़ना होगा। मुझे स्क्रिप्ट को एक या एक सेट करने के लिए सक्षम होना चाहिए, एक सेट टाइमस्टैम्प प्राप्त करने के लिए, कर्नेल टाइमस्टैम्प के साथ। फिर मैं अपने Xorg मुद्दों पर डिबगिंग पर वापस आ सकता हूं, जो इस समय मुझसे बचते हैं।


1
मुझे लगता है कि यह एक बग के रूप में योग्य है और इसकी सूचना दी जानी चाहिए। BTW syslog-ng साने टाइमस्टैम्प का उपयोग करता है जिसे आप sortअजगर स्क्रिप्ट के लिए वर्ष, समयक्षेत्र, आदि +1 कर सकते हैं ।
स्ट्रिबिका

@stribika: कि एक कर्नेल मुद्दा या एक syslog मुद्दा होगा? अथवा दोनों? लगता है कि सिस्टम को निलंबित कर दिया गया है .. शायद यह निलंबित और फिर से शुरू करने वाले हुक के साथ कर सकता है।
intuited

मेरे लिए ऐसा लगता है जैसे कर्नेल गलती पर है। Rel_time मान उस समय को "स्किप" नहीं करते, जबकि सिस्टम निलंबित था। मुझे यह अजीब लगता है कि वास्तव में सस्पेंड होने से पहले तिरछा शुरू हो जाता है। मान पहले से ही गलत हैं, Freezing user space processesजो सोने से पहले स्पष्ट रूप से किया जाता है।
स्ट्रिबिका

2
@stribika: उस पर मेरा कार्य सिद्धांत यह है कि उन घटनाओं को फिर से शुरू करने के बाद तक syslog करने के लिए धक्का नहीं दिया जाता है, क्योंकि वे तब होते हैं जब syslog खुद को निलंबित कर दिया गया हो।
intuited

@stribika: इसके अलावा, आप कर्नेल के "गलती पर" होने के बारे में सही हैं: जैसा कि मैं इसे समझता हूं (पुनर्विचार के बाद), syslog सिर्फ [12345.6789]..कर्नेल द्वारा उत्सर्जित पाठ के लिए पूर्ण टाइमस्टैम्प (साथ शुरू होने वाला ) को उपसर्ग करता है , इसलिए यह सही तरीके से काम कर रहा है , मेरी पिछली टिप्पणी से संबोधित मुद्दों के अधीन। मुझे यकीन नहीं है कि वास्तव में यहाँ क्या कर्नेल होना चाहिए; यह उन स्टार्टअप-सापेक्ष टाइमस्टैम्प को इंगित करने के लिए क्या है पर निर्भर करता है। रनिंग टाइम (बूट के बाद से समय के विपरीत) कुछ संदर्भों में सार्थक हो सकता है। मुझे लगता है कि आदर्श रूप में उन दोनों मूल्यों का एक विश्वसनीय रिकॉर्ड होगा।
intuited

जवाबों:


4

दिलचस्प समस्या है, यकीन नहीं कि मैंने कभी ऐसा करने की कोशिश की है। लेकिन मुझे पता है कि आप जिस टाइमस्टैम्प के बारे में बात कर रहे हैं और मैंने हमेशा बूटअप के बाद से सेकंड के लिए इसे सही माना है।

मेरे सर्वर पर मेरे syslog में, मेरे पास है:

Jan 10 19:58:55 wdgitial kernel: [    0.000000] Initializing cgroup subsys cpuset
Jan 10 19:58:55 wdgitial kernel: [    0.000000] Initializing cgroup subsys cpu
Jan 10 19:58:55 wdgitial kernel: [    0.000000] Linux version 2.6.32-21-server (buildd@yellow) (gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) ) #32-Ubuntu SMP Fri Apr 16     09:17:34 UTC 2010 (Ubuntu 2.6.32-21.32-server 2.6.32.11+drm33.2)
Jan 10 19:58:55 wdgitial kernel: [    0.000000] Command line:  root=/dev/xvda1 ro quiet splash

मुझे लगता है कि यह अधिकांश लिनक्स डिस्ट्रो के बीच काफी सुसंगत है क्योंकि यह कर्नेल थूक को बाहर निकाल रहा है।

और यहां मेरे पास टाइमस्टैम्प के साथ तारीख है।


3

आप इसे आजमा सकते हैं:

सबसे पहले, dmesg फ़ाइल का टाइमस्टैम्प प्राप्त करें (मेरी धारणा यह है कि यह dmesg का समय 0 होगा)। आप उपयोग करेंगे

ls -l - समय-शैली = +% s

/var/log$ ls -l --time-style=+%s dmesg
-rw-r----- 1 root adm 56181 1294941018 dmesg

आप सेकंडों को मानव-पठनीय तारीख में बदल सकते हैं

perl -e 'print scalar localtime(1294941018)' 

तो एक पठनीय घटना समय देखने के लिए, dmesg में घटना से सेकंड में जोड़ें। यदि dmesg घटना 55.290387 सेकंड में थी, तो 55 या 55.290387 जोड़ें:

perl -e 'print scalar localtime(1294953978 + 55)'

युग-मूल सेकंड को पठनीय समय में बदलने का एक और तरीका यह है कि सुझाव के अनुसार दिनांक -d का उपयोग करें। यदि आप -d के साथ दिए गए समय का प्रतिनिधित्व करने के लिए 'तारीख' बताते हैं, तो आप संकेत दे सकते हैं कि परिवर्तित होने का समय @ का उपयोग करके सेकंड-से-द-युग में है।

date -d "@1294953978"

यह आपको आउटपुट के रूप में "थू जन 13 15:26:18 सीएसटी 2011" जैसा कुछ देता है।

दिनांक +% s
सेकंड-से-युग प्रारूप में वर्तमान समय प्रिंट करेगा।

मुझे याद नहीं है कि शेल गणित कैसे किया जाता है, इसलिए मैं आमतौर पर उपरोक्त विधि का उपयोग करता हूं। :)


1
@jgbelacqua: आप चाहते हैं date -d @$((1294953978 + 55)), कम से कम बैश के तहत। हालाँकि, कुछ कर्नेल टाइमस्टैम्प तिरछे होते हैं, जिसका अर्थ है कि इस विधि द्वारा उत्पादित समय उनके संबंधित टाइमस्टैम्प की तुलना में पहले होगा /var/log/syslog। ऐसा लगता है कि यह निलंबित-से-राम की घटनाओं के परिणामस्वरूप होता है, संभवतः हाइबरनेशन और संभवतः कुछ अन्य सामानों के अलावा, क्योंकि कर्नेल का समय उन अवधि के दौरान नहीं बढ़ रहा है। अधिक जानकारी के लिए प्रश्न अद्यतन देखें।
intuited

2

Dmesg से डेट पर नंबर मैप करने का सबसे आसान तरीका dateप्रोग्राम का उपयोग करना है।

date -d "-50595 seconds"

यह कमांड वर्तमान समय के शून्य से 50595 सेकंड के लिए तिथि प्रदर्शित करता है।

से man date:

-d, --date=STRING
       display time described by STRING, not `now'

संख्या संचालित-ऑन समय के बराबर होती है, न कि बूट समय के बाद का समय।


2

चूंकि आपने सस्पेंड / रिज्यूमे के दौरान बदलते समय को तिरछा किया था, इसलिए मैं ध्यान देता हूं कि यह कम से कम एक स्थान पर प्रलेखित है। Dmesg (1) मैन पेज कहता है:

लॉग के लिए उपयोग किए जाने वाले समय स्रोत को सिस्टम SUSPEND / RESUME के ​​बाद अपडेट नहीं किया जाता है।

मुझे दीवार पर समय के साथ इन टाइमस्टैम्प को रखने के लिए कर्नेल बनाने का कोई तरीका नहीं मिला।


1

त्वरित, गंदा, काम करता है।

$ dmesg | grep 3w | perl /root/print_time_offset.pl

उस स्क्रिप्ट की सामग्री:

$ cat /root/print_time_offset.pl

#!/usr/bin/perl

$uptime = `cat /proc/uptime | awk '{print $1}';`;
$boot = time() - $uptime;
chomp $boot;
while (<STDIN>) {
        if ($_ =~ /^\[([\s\d\.]+)\]/) {
                $time_offset = $1;
        }
        $real_time = sprintf scalar localtime($boot + $time_offset);
        $_ =~ s/\[[\s\d\.]+\]/\[$real_time\]/;
        print $_;
}

नमूना उत्पादन निम्नानुसार है:

[Mon Feb 21 23:06:33 2011] 3ware 9000 Storage Controller device driver for Linux v2.26.02.012.
[Mon Feb 21 23:06:33 2011] 3w-9xxx 0000:03:00.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16
[Mon Feb 21 23:06:33 2011] 3w-9xxx 0000:03:00.0: setting latency timer to 64
[Mon Feb 21 23:06:33 2011] scsi4 : 3ware 9000 Storage Controller
[Mon Feb 21 23:06:33 2011] 3w-9xxx: scsi4: Found a 3ware 9000 Storage Controller at 0xfbcde000, IRQ: 16.
[Mon Feb 21 23:06:34 2011] 3w-9xxx: scsi4: Firmware FE9X 4.08.00.006, BIOS BE9X 4.08.00.001, Ports: 4.
[Mon Feb 21 23:06:35 2011] 3w-9xxx: scsi4: ERROR: (0x03:0x0101): Invalid command opcode:opcode=0x85.
[Mon Feb 21 23:06:35 2011] 3w-9xxx: scsi4: ERROR: (0x03:0x0101): Invalid command opcode:opcode=0x85.
[Mon Feb 21 23:06:35 2011] 3w-9xxx: scsi4: ERROR: (0x03:0x0101): Invalid command opcode:opcode=0x85.
[Mon Feb 21 23:06:35 2011] 3w-9xxx: scsi4: ERROR: (0x03:0x0101): Invalid command opcode:opcode=0x85.
[Mon Feb 21 23:06:35 2011] 3w-9xxx: scsi4: ERROR: (0x03:0x0101): Invalid command opcode:opcode=0x85.
[Mon Feb 21 23:06:35 2011] 3w-9xxx: scsi4: ERROR: (0x03:0x0101): Invalid command opcode:opcode=0x85.
[Sat Feb 26 02:01:01 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x0029): Verify started:unit=0, subunit=1.
[Sat Feb 26 02:01:01 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x0029): Verify started:unit=0, subunit=0.
[Sat Feb 26 16:49:13 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x002B): Verify completed:unit=0, subunit=1.
[Sat Feb 26 17:07:19 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x002B): Verify completed:unit=0, subunit=0.
[Sat Mar  5 02:00:16 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x0029): Verify started:unit=0, subunit=1.
[Sat Mar  5 02:00:16 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x0029): Verify started:unit=0, subunit=0.
[Sat Mar  5 18:48:57 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x002B): Verify completed:unit=0, subunit=1.
[Sat Mar  5 19:05:17 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x002B): Verify completed:unit=0, subunit=0.
[Sat Mar 12 02:00:30 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x0029): Verify started:unit=0, subunit=1.
[Sat Mar 12 02:00:30 2011] 3w-9xxx: scsi4: AEN: INFO (0x04:0x0029): Verify started:unit=0, subunit=0.

1
मैं अनुमान लगा रहा हूं कि आप केवल प्रश्न के पैराग्राफ के पहले दो भाग को पढ़ें। इसे और अधिक विस्तार से देखें। या, वैकल्पिक रूप से, अपने कंप्यूटर को निलंबित करने की कोशिश करें और यह देखने के लिए जांचें कि क्या आपकी स्क्रिप्ट सही ढंग से नए लॉग किए गए संदेशों की पूर्ण समयसीमा की रिपोर्ट करती है।
intuited
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.