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 ?

251voto

RC. Points 18567

Comprendre dmesg Le timestamp est assez simple : c'est le temps en secondes depuis le démarrage du noyau. Ainsi, avoir l'heure de démarrage ( uptime ), vous pouvez additionner les secondes et les afficher dans le format que vous souhaitez.

Ou mieux, vous pouvez utiliser le -T option de ligne de commande de dmesg et analyser le format lisible par l'homme.

De la page de manuel :

-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.

34voto

Lucas Cimon Points 178

Avec l'aide de Dr J'ai écrit une solution de contournement qui effectue la conversion à mettre dans votre .bashrc. Cela ne cassera rien si vous n'avez pas d'horodatage ou des horodatages déjà corrects.

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

En outre, une bonne lecture sur la logique de conversion des timestamps de dmesg et comment activer les timestamps quand il n'y en a pas : https://supportcenter.checkpoint.com/supportcenter/portal?eventSubmit_doGoviewsolutiondetails=&solutionid=sk92677

21voto

Allen Belletti Points 311

Pour les systèmes sans "dmesg -T" comme RHEL/CentOS 6, j'ai apprécié la fonction "dmesg_with_human_timestamps" fournie par lucas-cimon plus tôt. Il a un peu de mal avec certaines de nos boîtes avec un grand temps de fonctionnement. Il s'avère que les timestamps du noyau dans dmesg sont dérivés d'une valeur de temps de fonctionnement conservée par les CPU individuels. Avec le temps, cette valeur se désynchronise avec l'horloge en temps réel. Par conséquent, la conversion la plus précise pour les entrées récentes de dmesg sera basée sur l'horloge du CPU plutôt que sur /proc/uptime. Par exemple, sur une machine CentOS 6.6 particulière, ici :

# 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

En tenant compte du fait que le temps de fonctionnement du CPU est en millisecondes, il y a un décalage de près de 5 heures et demie ici. J'ai donc révisé le script et l'ai converti en bash natif dans le processus :

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

19voto

runejuhl Points 121

Alors KevZero J'avais besoin d'une solution moins compliquée, alors j'ai trouvé la solution suivante :

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'

Voici un exemple :

$ 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

Si vous voulez que cela fonctionne un peu mieux, mettez l'horodatage de proc dans une variable à la place :)

5voto

Steffen Heil Points 1164

Dans les versions récentes de dmesg, vous pouvez simplement appeler dmesg -T .

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