Comment ajouter de la chaîne de date pour chaque ligne de permanence à l'écrit du fichier journal
Avoir un long programme de course qui écrit en continu à un fichier de log - comment est-il possible, indépendamment de toute mise en mémoire tampon des questions, pour ajouter une chaîne de date à chaque ligne écrite dans ce fichier à l'aide d'un script linux?
J'imagine quelque chose comme ceci:
tail -f logfile | ADD_DATE_TO_EACH_LINE > logfile2
L'entrée serait quelque chose comme ça:
abc
def
ghi
jkl
La sortie doit ressembler à cela:
2011-06-16 18:30:59 abc
2011-06-16 18:31:00 def
2011-06-16 18:35:21 ghi
2011-06-16 18:40:15 jkl
OriginalL'auteur bmk | 2011-06-16
Vous devez vous connecter pour publier un commentaire.
Avec perl:
Avec gawk:
Remplacer
command
avectail -f logfile
pour votre exemple. Ou, peut-être vous pouvez simplement rediriger l'origine du programme stdout/stderr de la pipe ci-dessus.L'avantage que vous obtenez avec cette réponse, c'est qu'il n'a pas pondre une nouvelle date de processus avec chaque ligne, mais les deux fonctionnent très bien.
perl -pne
?? Vous ne voulez pas-n
ainsi que-p
.Merci! Je ne sais pas vraiment perl. Je viens de couper et coller des autres crud à partir de l'internet. 🙂 La dernière fois que j'ai utilisé perl pour de vrai a été plus d'une décennie! J'ai l'habitude d'utiliser le gawk fourni la réponse ci-dessus, mais également le perl aussi dans le cas de l'OP n'était pas sur linux.
OriginalL'auteur Steve Prentice
Essayer
date +"%y-%m-%d %H:%M:%S"
au lieu de simplementdate
entraînerait la sortie exacte qu'il attend, et vous pouvez également ajouter la redirection vers le fichier de sortie en fin de compte. (C'est en fait deux notes) 🙂Merci, ça marche. Et si vous ajoutez
"
signes de$line
la coquille ne se développe pas*
panneaux indiquant le contenu du répertoire 😉Ah, bon point! Réponse de mise à jour.
le problème avec cette solution est la suivante : lorsque la mémoire tampon d'entrée de donnée pour le "tout en ligne de lecture de" la boucle est trop grand, quelques lignes sera tronquée.
OriginalL'auteur aioobe
Vous pouvez essayer ce
Exemple de sortie:
Vous pouvez corriger cela avec
sed
entre les deux, ou plutôt, au lieu de la inutile l'utilisation decat
;sed 's/%/%%/g' /etc/motd | xargs ...
OriginalL'auteur Felipe
Un peu longue, mais voici ce que je suis venu avec:
sed -u 's/%/%%/g'
? Faire le%
signes ont une signification particulière pourxargs
?Cette méthode fonctionne en mettant l'ensemble de la ligne dans la chaîne de format pour
date
, où%
a une signification particulière. Par exemple, si la ligne dans le journal de contenait%Y
ensuite, il serait remplacé par l'année, mais de la modifier à%%Y
avecsed
correctement la sortie%Y
.OK je vois. Très délicat 😉
J'ai une remarque additionnelle: Si il y a des guillemets simples (
'
) dans le flux d'entréexargs
se termine avec le message d'erreur suivant:xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
donc j'ai changé la commande àtail -f logfile | sed -u 's/%/%%/g' | tr "\n" "\0" | xargs -0 -I {} date +"%Y-%m-%d %H:%M:%S {}"
.OriginalL'auteur Andrew Clark
Pouvez-vous configurer le long de l'exécution du programme de l'écrire de sortie sur la sortie standard et de ne pas le fichier de log? Dans ce cas, il serait facile de rediriger la sortie vers un script qui écrit d'abord le timestamp actuel, puis l'entrée.
Si c'est impossible, il peut aider à intervalles réguliers (par exemple toutes les secondes) lire le fichier de log de contenu, copie de chaque ligne dans un autre fichier (en ajoutant le timestamp actuel), puis supprimez le fichier de log. Cela peut, cependant, imposer perdre du journal d'entrées sont écrites entre la lecture et la suppression d'un fichier 🙁
tail -f
est à mon avis plus ou moins la même chose que directement écrit sur la sortie standard stdout. En fait, je suis à la recherche pour que "script qui écrit d'abord le timestamp actuel et puis, à l'entrée".vous pouvez utiliser une FIFO ensuite. Le Programme va écrire tout pour le tube nommé (fifo) et que vous pouvez lire dans le même temps, ajouter la date et l'écriture de la réelle fichier de log.
OriginalL'auteur BurninLeo
Ou vous pouvez utiliser python ...
cat /dev/urandom | python -c "from __future__ import print_function; import sys; import datetime; map(lambda x: print(datetime.datetime.now(), x), [line for line in sys.stdin.readlines()])"
Ou l'utilisation de gnu écran
Vous devez d'abord activer la journalisation et l'horodatage sur votre ~/.screenrc.
OriginalL'auteur Jorge Niedbalski R.