Je voudrais lire mon dmesg Centos 5.x avec horodatage, comment faire?
dmesg -T
Je voudrais lire mon dmesg Centos 5.x avec horodatage, comment faire?
dmesg -T
Réponses:
dmesg
lit 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
/etc/rsyslog.conf
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
rc.local
est vraiment une sorte de solution laide pour cela (l'utilisation rc.local
est presque toujours une solution laide à n'importe quoi). Une meilleure solution serait de mettre printk.time = 1
en /etc/sysctl.conf
ou un fichier /etc/sysctl.d/
. C'est la raison pour laquelle ces fichiers existent. Cramper des trucs en rc.local
finira par vous laisser avec une start-up fragile, alambiquée, désordonnée et peu fiable.
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. :)
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
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 $_;'
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 $ _.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 $a
imprime le dmesg avec l'horodatage respectueux des paramètres régionaux substitué à l'horodatage "secondes depuis le démarrage".