Wie zum hinzufügen von Datums-string zu jeder Zeile einer kontinuierlich log-Datei geschrieben
Dass ein lange laufendes Programm, dass ständig schreibt in eine logfile - wie ist es möglich, ohne jegliche Pufferung Probleme, fügen Sie ein Datum-string in jede Zeile geschrieben, die Datei mit einem linux-Skript?
Ich könnte mir vorstellen so etwas wie dieses:
tail -f logfile | ADD_DATE_TO_EACH_LINE > logfile2
Input wäre sowas:
abc
def
ghi
jkl
Sollte die Ausgabe ähnlich wie:
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit perl:
Mit gawk:
Ersetzen
command
mittail -f logfile
für dein konkretes Beispiel. Oder vielleicht könnte man nur die Umleitung des ursprünglichen Programms, die die stdout/stderr zu den oben Rohr.perl -pne
?? Sie wollen nicht-n
sowie-p
.Versuchen
date +"%y-%m-%d %H:%M:%S"
anstatt einfachdate
führen würde, die genaue Leistung, die er erwartet; und man könnte auch hinzufügen, dass die Umleitung der Ausgabe-Datei am Ende. (Es ist eigentlich zwei Noten) 🙂"
Zeichen zu$line
die shell lässt sich nicht erweitern*
Zeichen, um den Inhalt des Verzeichnisses 😉Können Sie versuchen, diese
Beispiel-Ausgabe:
sed
dazwischen, oder eigentlich eher anstelle des nutzlos Verwendung voncat
;sed 's/%/%%/g' /etc/motd | xargs ...
Ein wenig langwierig, aber hier ist was ich kam mit:
sed -u 's/%/%%/g'
für? Tun die%
Zeichen haben eine Besondere Bedeutung fürxargs
?date
, wo%
hat eine Besondere Bedeutung. Zum Beispiel, wenn die Zeile, die im log enthaltenen%Y
dann würde ersetzt durch das Jahr, aber es zu verändern%%Y
mitsed
wird richtig ausgegeben%Y
.'
) in der input-streamxargs
beendet mit folgender Fehlermeldung:xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
daher änderte ich den Befehltail -f logfile | sed -u 's/%/%%/g' | tr "\n" "\0" | xargs -0 -I {} date +"%Y-%m-%d %H:%M:%S {}"
.Können Sie die Konfiguration der lange laufende Programm schreibt seine Ausgabe auf die Standardausgabe und nicht in die logfile? In diesem Fall wäre es einfach, leiten Sie die Ausgabe, um ein Skript, dass zuerst schreibt den aktuellen Zeitstempel und dann den Eintrag.
Falls dies nicht möglich ist, kann es helfen, in regelmäßigen Abständen (z.B. jede Sekunde) Lesen der logfile-Inhalt, kopieren Sie jede Zeile in eine andere Datei (durch hinzufügen der aktuelle timestamp) und dann löschen des logfile. Dies kann jedoch vorschreiben zu verlieren logfile-Einträge geschrieben werden, die zwischen dem Lesen und löschen der Datei 🙁
tail -f
ist meiner Meinung nach mehr oder weniger das gleiche wie direkt schreiben nach stdout. Eigentlich bin ich auf der Suche nach dem "Skript, das zuerst schreibt den aktuellen Zeitstempel und dann den Eintrag".Oder Sie können die Verwendung von 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()])"
Oder verwenden Sie gnu screen
Zuerst müssen Sie zum aktivieren der Protokollierung und Zeitstempel auf Ihre ~/.screenrc.