Linux Centos avec horodatage dmesg

15

Je voudrais lire mon dmesg Centos 5.x avec horodatage, comment faire?

edotan
la source
plus tard, dmesg prend en charge l'indicateur -T, essayez peut-être d'utiliser -T si votre dmesg le prend en charge.
ilansch
Centos 7+ prend en chargedmesg -T
rogerdpack

Réponses:

12

dmesglit le tampon d'anneau du journal du noyau. Il ne fait pas d'horodatage. Ce que vous devez faire est de configurer syslog pour récupérer les journaux du noyau à partir de ce tampon et les envoyer dans un fichier (s'il n'est pas déjà configuré pour le faire). Remarque, la configuration par défaut de CentOS 5.x syslog envoie les journaux du noyau à /var/log/messages, si je me souviens bien.

Si vous souhaitez envoyer tous les journaux du noyau (dmesg) à /var/log/kern.log, en utilisant le démon syslog par défaut, vous devez ajouter une ligne comme celle-ci à/etc/syslog.conf

kern.*                         /var/log/kern.log
Christopher Cashell
la source
4
Merci pour la réponse. Pour tous ceux qui cherchent à utiliser CentOS 6, je l'ai trouvé dans/etc/rsyslog.conf
Safado
Oui, avec CentOS (et RHEL) 6.x, ils ont changé le démon syslog par défaut de l'ancien sysklogd en rsyslog. Il est également disponible en tant que package (pris en charge) pour RHEL / CentOS 5.x.
Christopher Cashell
1
Eh bien, j'ai eu cela sur ma liste de choses à comprendre, mais maintenant vous m'avez sauvé quelques recherches sur Google
Safado
8

Il existe une solution "Activation des horodatages pour dmesg / Kernel Ring Buffer"

Vous pourriez ajouter:

printk.time=1

au noyau cmdline.

Quant à moi, j'ai ajouté à rc.local sur toutes les machines avec marionnettes. C'est plus facile pour moi) :

if test -f /sys/module/printk/parameters/time; then
   echo 1 > /sys/module/printk/parameters/time
fi
Alex Bozhenko
la source
ça marche pour moi
c4f4t0r
5
L'utilisation rc.localest vraiment une sorte de solution laide pour cela (l'utilisation rc.localest presque toujours une solution laide à n'importe quoi). Une meilleure solution serait de mettre printk.time = 1en /etc/sysctl.confou un fichier /etc/sysctl.d/. C'est la raison pour laquelle ces fichiers existent. Cramper des trucs en rc.localfinira par vous laisser avec une start-up fragile, alambiquée, désordonnée et peu fiable.
Christopher Cashell
Ce qui est en commentaire de @ChristopherCashell est la seule bonne réponse à cette question. C'est dommage que ce ne soit pas une vraie réponse.
Petr
1

J'ai écrit ce script simple. Oui, c'est lent. Si vous voulez quelque chose de plus rapide, vous écrivez un script sur perl, python ou autre chose. Je suis sûr que ce simple script peut vous donner une idée de la façon dont il peut être calculé.

Veuillez noter que j'ai ignoré la fraction de secondes enregistrée dans chaque ligne (après le. Dans l'horodatage).

#!/bin/bash
localtime() {
 perl -e "print(localtime($1).\"\n\");";
}

upnow="$(cut -f1 -d"." /proc/uptime)"
upmmt="$(( $(date +%s) - ${upnow} ))"

dmesg | while read line; do
 timestamp="$(echo "${line}" | sed "s/^\[ *\([0-9]\+\).*/\1/g")"
 timestamp=$(( ${timestamp} + ${upmmt} ))
 echo "${line}" | sed "s/^[^]]\+]\(.*\)/$(localtime "${timestamp}") -\1/g"
done

J'espère que ça aide. :)

vengeur
la source
0

La modification de script dans la ligne de cas ne commence pas par un "["

#!/bin/bash
localtime() {
 perl -e "print(localtime($1).\"\n\");";
}

upnow=$(cut -f1 -d"." /proc/uptime)
upmmt=$(( $(date +%s) - ${upnow} ))

dmesg \
| while read LINE; do
    if [ "$(echo ${LINE} | egrep -v "^\[")" == "" ] ; then
        timestamp=$(echo "${LINE}" | sed "s/^\[ *\([0-9]\+\).*/\1/g")
        timestamp=$(( ${timestamp} + ${upmmt} ))
        echo "${LINE}" | sed "s/^[^]]\+]\(.*\)/$(localtime "${timestamp}") -\1/g"
    else
        echo "${LINE}"
    fi
done
MDA
la source
0

Il s'agit d'une mise à jour de la suggestion de Plutoid, supprimant les espaces de tête de l'horodatage.

dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/( *)(\d+)\.\d+/localtime($2 + $a)/e; print $_;' 
  • perl -n est un moyen de lire l'entrée standard et de lire dans la variable $ _.
  • Le corps (pas la section BEGIN) est ensuite exécuté une fois pour chaque ligne.
  • BEGIN exécute le code en {} une fois.
  • $ a est le début de dmesg depuis l'époque (secondes)
  • La commande s / ... prend la valeur de $ _ et remplace la partie \ s * #####. ###### de l'horodatage par la version "heure locale" du décalage dmesg ($ 1) ajoutée à l'heure de début du système ($ a)
  • print $ a imprime le dmesg avec l'horodatage respectueux des paramètres régionaux substitué à l'horodatage "secondes depuis le démarrage".
Luigi Bai
la source
1
Et comme la réponse originale, elle a besoin d'explications. Pouvez-vous modifier votre article, le décomposer et le parcourir?
Cory Knutson
-1

Un petit script perl comme ci-dessous. C'est une manière générale, et je ne suis pas l'auteur.

dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/(\d+)\.\d+/localtime($1 + $a)/e; print $_;'
  • perl -n est un moyen de lire l'entrée standard et de lire dans la variable $ _.
  • Le corps (pas la section BEGIN) est ensuite exécuté une fois pour chaque ligne.
  • BEGIN exécute le code en {} une fois.
  • $ a est le début du dmesg depuis l'époque
  • La commande s / ... prend la valeur de $ _ et remplace la partie #####. ###### de l'horodatage par la version "heure locale" du décalage dmesg ($ 1) ajoutée au démarrage du système temps ($ a)
  • print $ a imprime le dmesg avec l'horodatage respectueux des paramètres régionaux substitué à l'horodatage "secondes depuis le démarrage".
Howard.TH
la source
1
Cette réponse a besoin de plus d'explications.
kasperd
@kasperd Voici ce que cela signifie: - perl -n est un moyen de lire l'entrée standard et de lire dans la variable $ _. Le corps (pas la section BEGIN) est ensuite exécuté une fois pour chaque ligne. - BEGIN exécute le code en {} une fois. $ a est le début de dmesg depuis l'époque - La s/...commande prend la valeur dans $ _ et remplace la partie #####. ###### de l'horodatage par la version "localtime" de l'offset dmesg ($ 1 ) ajouté à l'heure de démarrage du système ($ a). - print $aimprime le dmesg avec l'horodatage respectueux des paramètres régionaux substitué à l'horodatage "secondes depuis le démarrage".
dadinck