151 votes

Comment convertir le timestamp de dmesg en format de date personnalisé ?

J'essaie de comprendre le dmesg et il est difficile de le convertir en date java ou en format de date personnalisé.

Exemple de journal dmesg :

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

Alors comment puis-je convertir 14614.647880 à une date standard ?

4voto

Anne van Rossum Points 518

Si vous n'avez pas le -T option pour dmesg comme par exemple sur Andoid, vous pouvez utiliser l'option busybox version. Ce qui suit résout également d'autres problèmes :

  1. El [0.0000] est précédé de quelque chose qui ressemble à des informations de couleur mal placées, des préfixes tels que <6> .
  2. Faire des entiers à partir de flottants.

Il s'inspire de cet article de blog .

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

Notez, cependant, que cette mise en œuvre est assez lente.

3voto

imcom Points 11

Vous devrez référencer le "btime" dans /proc/stat, qui est l'heure de l'époque Unix à laquelle le système a été démarré pour la dernière fois. Vous pouvez ensuite vous baser sur cette heure de démarrage du système et ajouter les secondes écoulées indiquées dans dmesg pour calculer l'horodatage de chaque événement.

3voto

dr. Points 198

Avec les distros Linux plus anciennes, une autre option consiste à utiliser un script enveloppant, par exemple en Perl ou Python.

Voir les solutions ici :

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

1voto

mivk Points 1352

Une mise en garde que les autres réponses ne semblent pas mentionner est que le temps qui est montré par dmesg ne prend pas en compte le temps de sommeil/suspension. . Il existe donc des cas où la réponse habituelle consistant à utiliser dmesg -T ne fonctionne pas, et affiche une heure complètement fausse.

Une solution de contournement pour de telles situations consiste à écrire quelque chose dans le journal du noyau à un moment connu, puis à utiliser cette entrée comme référence pour calculer les autres moments. Évidemment, cela ne fonctionnera que pour les temps postérieurs à la dernière suspension.

Ainsi, pour afficher l'heure correcte des entrées récentes sur des machines qui peuvent avoir été suspendues depuis leur dernier démarrage, utilisez quelque chose comme ceci à partir de mon site Web. autre réponse ici :

# write current time to kernel ring buffer so it appears in dmesg output
echo "timecheck: $(date +%s) = $(date +%F_%T)" | sudo tee /dev/kmsg

# use our "timecheck" entry to get the difference
# between the dmesg timestamp and real time
offset=$(dmesg | grep timecheck | tail -1 \
| perl -nle '($t1,$t2)=/^.(\d+)\S+ timecheck: (\d+)/; print $t2-$t1')

# pipe dmesg output through a Perl snippet to
# convert it's timestamp to correct readable times
dmesg | tail \
| perl -pe 'BEGIN{$offset=shift} s/^\[(\d+)\S+/localtime($1+$offset)/e' $offset

1voto

16851556 Points 158

dmesg -T peut afficher une heure erronée, différente de date sortie de commande.

La solution de contournement est journalctl avec -k, --dmesg. J'utilise -k car il est plus court :

journalctl -k

Il n'affichera que les messages du noyau et l'heure correcte.

Pour afficher uniquement les lignes de noyau correspondant à la phrase :

journalctl -kg phrase

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X