Ich verwende den Befehl „tee“, um die Ergebnisse eines langen Bash-Befehls in einer Datei festzuhalten.
Kann die Datei, die ich mit tee ausgebe, jeder Zeile irgendwie den Zeitstempel voranstellen, wann die Zeile geschrieben wurde? Ich suche nach einer Lösung, bei der jede Zeile einen anderen Datums-/Uhrzeitwert hat ... nicht den gleichen Wert, der jeder Zeile vorangestellt wird.
Der Grund, warum ich dies möchte, ist, dass es sehr nützlich wäre, zu wissen, wann jede Zeile später ausgegeben wurde, wenn ich die Datei durchlese, um zu verstehen, wo die langsamen Bereiche waren.
Antwort1
Wenn tee etwas nicht tun kann, leiten Sie es an ein Programm weiter, das es kann.mehrutilshat ein Tool namens, ts
dessen Zweck genau dieser ist:
$ Echotest | ts 02. Februar 13:17:27 Test
Wenn Sie einen Zeitstempel wünschenalles, die Verwendung sollte offensichtlich sein:
myapp | ts | tee app.log
Auch andere Kombinationen sind möglich, zum Beispiel um nur die Bildschirmausgabe oder nur die Protokolldatei mit einem Zeitstempel zu versehen:
myapp | tee app.log | ts
myapp | tee >(ts > app.log)
myapp | tee /dev/tty | ts > app.log
myapp | pee "ts > app.log" "cat"
myapp | pee "cat > app.log" "ts"
(Ja, das Letzte ist auch von moreutils.)
Antwort2
Eine Alternative zu ts
:
echo "foo" | stdbuf -o0 sed 's/%/%%/g' | xargs -d '\n' -I {} date '+%F %T {}' | tee -a "/tmp/foo.log"
Ausgabe:
# cat "/tmp/foo.log"
2022-02-24 09:43:00 foo
Beispiel zum Protokollieren von stdout und stderr in eine Datei (entfernen, /dev/null
um auch ins Terminal zu schreiben):
exec &> >(stdbuf -o0 sed 's/%/%%/g' | xargs -d '\n' -I {} date '+%F %T {}' | tee -a "/tmp/std.log" >/dev/null )
Eine weitere Alternative durch Verwendung von awk
:
echo "foo" | xargs -d'\n' -I{} echo '{}' | awk '{ print strftime("%F %T"), $0; fflush(); }' | tee -a "/tmp/foo.log"