5 votes

Enregistrement dans un fichier, en ajoutant un horodatage à chaque ligne (Debian)

J'essaie d'enregistrer la sortie de certains Shell Shell de la mienne dans un fichier, et je veux que l'horodatage soit ajouté à chaque ligne. D'après ce que j'ai compris, c'est ce que logger(1) mais je ne veux pas que la sortie aille dans /var/log/messages, et je ne vois pas comment cela est possible avec logger. Au fait, j'utilise Debian.

Quelle est la meilleure façon de procéder ?

-Oliver

0 votes

Note méta : c'est un doublon de unix.stackexchange.com/questions/26728/

6voto

Dorus Points 665

La fonction de logger est en fait de transférer les messages vers syslog ; les configurations par défaut ajouteront un timestamp et écriront les logs dans /var/log/messages, mais cela ne signifie pas que le but de logger est d'ajouter un timestamp.

Une façon de gérer cela serait de modifier vos configurations syslog de sorte que vos messages routés via logger aillent dans un fichier spécial - utilisez l'option "-p" de logger pour stipuler une paire installation.priorité (peut-être une des installations user[1..7]), et configurez votre syslogd pour enregistrer cette installation dans un fichier spécial.

Vous pouvez également créer une fonction Shell rapide pour simplement ajouter l'horodatage :

Bodacious:~ james$ timestamp () {
> f=`date`
> echo $f $*
> }
You have new mail in /var/mail/james
Bodacious:~ james$ timestamp a line of logs
Tue 18 Jan 2011 22:40:24 EST a line of logs
Bodacious:~ james$ 

Sur mon système, cela va se traduire par le Shell forking /bin/date une fois par ligne de sortie. C'est inefficace, mais probablement acceptable à petite échelle.

0 votes

Merci pour cette bonne réponse :) C'était mon idée originale, mais je me suis dit "il doit y avoir un programme qui fait déjà ça" mais visiblement non ! Ou pas un qui est couramment utilisé de toute façon. Par curiosité, quelles sont les "facilités utilisateur [1..7]" auxquelles vous faites référence ?

0 votes

En essayant de fournir une référence faisant autorité pour ma réponse, j'ai découvert que j'avais un peu tort. Les "facilités" sont l'une des façons dont syslog segmente les messages qu'il traite. Il y a 23 facilités définies - la plupart pour des types de messages de logs qui étaient communs quand syslog a été créé (lpr, ftp, cron), quelques uns pour être des buckets génériques (messages, système) - mais il y a 8 facilités appelées local0 à local7 (pas user1 à user7 comme je l'ai dit à l'origine) intentionnellement conçues pour des utilisations locales. Voir RFC5424 pour la liste complète des facilités.

4voto

Grzegorz Gacek Points 51

J'avais besoin de quelque chose comme ça, et google m'a amené ici. Utiliser quelque chose comme syslog est définitivement une surcharge pour juste essayer de chronométrer quelque chose, et l'impression à chaque seconde est trop peu pratique.

Voici une ligne simple qui semble fonctionner correctement :

cmd | { while read R; do echo "$(date +%s) $R"; done }

et une variante qui imprime le temps qu'il a fallu pour produire chaque ligne :

cmd | { T=$(date +%s); while read R; do T2=$(date +%s); echo "$((T2-T)) $R"; T=$T2; done }

(Ceci utilise des secondes, il n'est probablement pas trop difficile de lancer %N là-dedans, mais à ce niveau, une solution Shell n'est probablement pas le bon outil de toute façon).

0voto

jrojo Points 244

Vous pourriez utiliser -t pour marquer chaque ligne, et ensuite faire en sorte que votre serveur syslog filtre vers un fichier différent en fonction de cette marque.

(Modifié pour supprimer la référence incorrecte à -f drapeau)

0 votes

Ce n'est pas ce que -f fait. Il utilise le contenu du fichier comme partie du message de l'entrée du journal.

0 votes

Toutes mes excuses ! J'ai mal lu la page de manuel. Cependant, la deuxième partie de la réponse est valable, donc je l'ai modifiée pour inclure cela.

0voto

Steve Bennett Points 5299

En utilisant la réponse de Commande pour ajouter une chaîne de caractères à chaque ligne ? J'ai trouvé que c'était la solution la plus simple :

cmd | sed "s/^/`date +'%a %b %d %k:%M:%S'` /"

0 votes

Non, c'est cassé : il ajoute la même date à toutes les lignes.

0 votes

Eh bien, il est cassé si vous voulez exécuter un processus complet de génération de journaux à travers lui. Je l'utilise au fur et à mesure que je génère chaque ligne.

0 votes

Si vous l'utilisez pour une seule ligne, vous n'avez pas besoin de pipe -- c'est presque exactement la même chose que date +...; cmd . La seule différence est que vous obtenez une nouvelle ligne à partir de date que vous pouvez supprimer de la manière habituelle.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X