Timestamp correlati / var / log / *


20

/var/log/messages, /var/log/sysloge alcuni altri file di registro utilizzano un timestamp che contiene un tempo assoluto, come Jan 13 14:13:10.

/var/log/Xorg.0.loge /var/log/dmesg, oltre all'output di $ dmesg, utilizzare un formato simile

[50595.991610] malkovich: malkovich malkovich malkovich malkovich

Sto indovinando / raccogliendo che i numeri rappresentano secondi e microsecondi dall'avvio.

Tuttavia, il mio tentativo di correlare questi due set di timestamp (usando l'output di uptime) ha prodotto una discrepanza di circa 5000 secondi.

Questo è approssimativamente il periodo di tempo in cui il mio computer è stato sospeso.

C'è un modo conveniente per mappare i timestamp numerici usati da dmesg e Xorg in timestamp assoluti?

aggiornare

Come passo preliminare per capire questo, e anche per spero di rendere la mia domanda un po 'più chiara, ho scritto uno script Python per analizzare /var/log/sysloge produrre l'inclinazione del tempo. Sul mio computer, con Ubuntu 10.10, quel file contiene numerose linee originate dal kernel che sono stampate sia con il timestamp dmesg che con il timestamp syslog. Lo script genera una riga per ogni riga in quel file che contiene un timestamp del kernel.

Uso:

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

Output espurgato (vedi sotto per le definizioni delle colonne):

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

... rel_offsetè 0 per tutte le linee intermedie ...

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 per tutte le linee rimanenti ...

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

... Le linee finali sono un po 'più in basso, ancora ben al di sopra della fine dell'output. Alcuni di loro presumibilmente dmesgfurono scritti nel buffer circolare prima che la sospensione avvenisse, e furono propagati solo in syslogseguito. Questo spiega perché tutti hanno lo stesso timestamp syslog.

Definizioni delle colonne:

abs è il tempo registrato da syslog.

abs_since_bootè lo stesso tempo in secondi dall'avvio del sistema, basato sul contenuto /proc/uptimee sul valore di time.time().

rel_time è il timestamp del kernel.

rel_offsetè la differenza tra abs_since_boote rel_time. Sto arrotondando questo a decine di secondi in modo da evitare errori una tantum dovuti ai syslogtimestamp assoluti (cioè generati) che hanno solo la precisione dei secondi. Questo non è in realtà il modo giusto di farlo, dal momento che (credo ...) si traduce in una minore possibilità di avere un errore off-by-10. Se qualcuno ha un'idea migliore, per favore fatemi sapere.

Ho anche alcune domande sul formato della data di syslog; in particolare, mi chiedo se mai un anno ci si presenta. Immagino di no, e in ogni caso potrebbe molto probabilmente aiutarmi a ottenere tali informazioni in TFM, ma se qualcuno capisse che sarebbe utile. ..Supponendo, ovviamente, che qualcuno userà questo script ad un certo punto in futuro, invece di eliminare solo un paio di righe di codice Perl.

Il prossimo:

Quindi, a meno che una rivelazione di benvenuto non mi sia stata data da uno di voi, il mio prossimo passo sarà quello di aggiungere una funzione per ottenere il tempo distorto per un dato timestamp del kernel. Dovrei essere in grado di alimentare lo script uno o un insieme di syslog, insieme a un timestamp del kernel, per ottenere un timestamp assoluto. Quindi posso tornare al debug dei miei problemi con Xorg, che al momento mi sfuggono.


1
Penso che questo si qualifichi come un bug e dovrebbe essere segnalato. BTW syslog-ng usa timestamp sani che puoi ordinare sort, avere anno, fuso orario, ecc. +1 per lo script Python.
stribika,

@stribika: sarebbe un problema del kernel o un problema di syslog? O entrambi? Sembra che syslog debba essere avvisato che il sistema è stato sospeso .. forse potrebbe farlo da solo con la sospensione e il ripristino degli hook.
intuito l'

A me sembra che il kernel sia in colpa. I valori rel_time non "saltano" l'ora mentre il sistema era sospeso. Trovo strano tuttavia che l'inclinazione inizi prima che la sospensione accada davvero. I valori sono già sbagliati per i Freezing user space processesquali è chiaramente fatto prima di dormire.
stribika,

2
@stribika: La mia teoria di lavoro su questo è che quegli eventi non vengono inviati a syslog fino a dopo il riassunto, perché si verificano dopo che lo stesso syslog è stato sospeso.
intuito il

@stribika: Inoltre, hai ragione sul fatto che il kernel sia "in errore": come ho capito (dopo aver riconsiderato), syslog prefigura semplicemente il timestamp assoluto al testo (che inizia con [12345.6789]..) emesso dal kernel, quindi sta facendo le cose correttamente , fatti salvi i problemi risolti dal mio ultimo commento. Non sono sicuro di cosa dovrebbe fare davvero il kernel qui; dipende da cosa indicano quei timestamp relativi all'avvio. Il tempo di esecuzione (al contrario del tempo trascorso dall'avvio) può essere significativo in alcuni contesti. Immagino idealmente che ci sarebbe una registrazione affidabile di entrambi questi valori.
intuito il

Risposte:


4

Problema interessante, non sono sicuro di aver mai provato a farlo. Ma ho notato il timestamp di cui stai parlando e l'ho sempre creduto essere secondi dall'avvio.

Nel mio syslog ho sul mio server, ho:

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

Immagino che questo sia abbastanza coerente con la maggior parte delle distro Linux poiché questo è il kernel che sputa è roba.

E qui ho la data insieme al timestamp.


3

Puoi provarlo:

Per prima cosa, prendi il timestamp del file dmesg (il mio presupposto è che questo sarà il tempo 0 di dmesg). Lo userete

ls -l --time-style = +% s

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

È possibile convertire i secondi in una data leggibile dall'uomo con

perl -e 'print scalar localtime(1294941018)' 

Quindi, per vedere un orario dell'evento leggibile, aggiungi i secondi dall'evento in dmesg. Se l'evento dmesg è durato 55.290387 secondi, aggiungi 55 o 55.290387:

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

Un altro modo per trasformare i secondi con radice epocale in tempo leggibile è usare la data -d come suggerito. Se si dice 'date' per rappresentare un orario fornito con -d, è possibile indicare che l'ora da convertire è in secondi dall'epoca usando @.

date -d "@1294953978"

Questo ti dà qualcosa come "Gio 13 gen 15:26:18 CST 2011" come uscita.

data +% s
stamperà l'ora corrente nel formato secondi dall'epoca.

Non ricordo come fare i calcoli della shell, quindi di solito uso il metodo perl come sopra. :)


1
@jgbelacqua: vuoi date -d @$((1294953978 + 55)), almeno sotto bash. Tuttavia, alcuni timestamp del kernel sono inclinati, il che significa che i tempi prodotti da questo metodo sarebbero precedenti ai loro corrispondenti timestamp /var/log/syslog. Sembra che ciò accada a seguito di eventi di sospensione su RAM, presumibilmente in aggiunta al letargo e forse ad altre cose, perché il tempo del kernel non aumenta durante quei periodi. Vedi l'aggiornamento delle domande per maggiori informazioni.
intuito il

2

Il modo più semplice per mappare il numero da dmesg a una data è usare il dateprogramma.

date -d "-50595 seconds"

Questo comando visualizza la data per l'ora corrente meno 50595 secondi.

Da man date:

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

Il numero è uguale al tempo di accensione, non al tempo trascorso dal momento dell'avvio.


2

Dato che hai notato che l'inclinazione del tempo cambia durante la sospensione / ripresa, noterò che questo è documentato in almeno un posto. La pagina man dmesg (1) dice:

L'origine temporale utilizzata per i registri non viene aggiornata dopo il sistema SUSPEND / RESUME.

Non sono riuscito a trovare un modo per far sì che il kernel mantenga questi timestamp in sincronia con il tempo del muro.


1

Veloce, sporco, funziona.

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

Contenuto di quello script:

$ 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 $_;
}

L'output di esempio è il seguente:

[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
Immagino tu abbia letto solo i primi due paragrafi della domanda. Dai un'occhiata più in dettaglio. Oppure, in alternativa, prova a sospendere il computer e verifica se lo script riporta correttamente i timestamp assoluti dei messaggi appena registrati.
intuito il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.