Frage Wie fügt man dem Bash-Skriptprotokoll einen Zeitstempel hinzu?


Ich habe ein ständig laufendes Skript, das ich in eine Protokolldatei ausgibt:

script.sh >> /var/log/logfile

Ich möchte vor jeder Zeile, die an das Protokoll angehängt wird, einen Zeitstempel hinzufügen. Mögen:

Sat Sep 10 21:33:06 UTC 2011 The server has booted up.  Hmmph.

Kann ich Jiu-Jitsu benutzen?


77
2017-09-10 21:35


Ursprung


Sieh diese Quest an. serverfault.com/questions/80749/.... Eine paar Antwort würde hier gelten. - Zoredache
Für eine awk / gawk Lösung siehe: stackoverflow.com/questions/21564/... - User


Antworten:


Sie können die Ausgabe des Skripts durch eine Schleife leiten, die dem aktuellen Datum und der aktuellen Uhrzeit vorangestellt ist:

./script.sh | while IFS= read -r line; do echo "$(date) $line"; done >>/var/log/logfile

Wenn Sie dies häufig verwenden, ist es einfach, eine Bash-Funktion zu erstellen, um mit der Schleife umzugehen:

adddate() {
    while IFS= read -r line; do
        echo "$(date) $line"
    done
}

./thisscript.sh | adddate >>/var/log/logfile
./thatscript.sh | adddate >>/var/log/logfile
./theotherscript.sh | adddate >>/var/log/logfile

78
2017-09-10 21:58



@ Nils ist ein Trick zu verhindern read vom Trimmen von Leerzeichen am Anfang und Ende der Zeile. Es setzt IFS (bash's Internal Field Separator, im Grunde eine Liste von Leerzeichen) leer für die read Befehl. - Gordon Davisson
... und -r ignoriert das Escape-Zeichen "\". Dies sollte in jedem Fall wirklich funktionieren - großartige Skripte. - Nils
@ Nils ist es nicht vollständig kugelsicher, da einige Implementierungen von echo interpretieren Escape-Sequenzen. Wenn du Ja wirklich will es nicht mit dem Inhalt durcheinander bringen (außer das Hinzufügen von Daten), ersetzen Sie die echo Befehl mit printf "%s %s\n" "$(date)" "$line" - Gordon Davisson
Vielleicht interessiert dich das ISO-8601-konform Datum / Zeitstempel: date -u +"%Y-%m-%dT%H:%M:%SZ" oder vielleicht hübscher date +"%Y-%m-%d %T". - Pablo Bianchi
Während dieses Skript wie erwartet funktioniert, erzeugt es einen neuen Prozess (execute date) zum jeder Log-Linie, die ein großer Nachteil sein kann, abhängig von Ihrer Maschine und der Menge der Protokolle. Ich würde eher vorschlagen zu verwenden ts falls verfügbar, siehe die Antwort von @willem - Michael Schaefers


Siehe "ts" vom Ubuntu "moreutils" -Pkg:

command | ts

Oder wenn $ command automatisch gepuffert wird (erfordert expect-dev pkg):

unbuffer command | ts

41
2017-10-29 15:20





Du kannst es einfach Echo Der Befehl wird an die Protokolldatei ausgegeben. dh,

echo "`date -u` `./script.sh`" >> /var/log/logfile

Es funktioniert wirklich :)

Beispiel:

[sparx@E1]$ ./script.sh 
Hello Worldy
[sparx@E1]$ echo "`date -u` `./script.sh`" >> logfile.txt
[sparx@E1]$ cat logfile.txt 
Mon Sep 12 20:18:28 UTC 2011 Hello Worldy
[sparx@E1]$ 

11
2017-09-10 22:03



Hmm funktioniert nicht für mich. - Antonius Bloch
Was bekommen Sie, wenn Sie den Befehl ausführen? - SparX
Das setzt einen Zeitstempel vor der gesamten Ausgabe von '' ./script.sh '', nicht vor jeder Zeile. - clacke


Das Datum Befehl wird diese Informationen bereitstellen

date -u
Sat Sep 10 22:39:24 UTC 2011

also kannst du

echo $(date -u) "Some message or other"

ist es das was du wolltest ?


10
2018-02-03 17:23



Die Verwendung des Datumsbefehls war eine Art von dem, was ich im Sinn hatte, aber das kann ich dem Skript selbst nicht hinzufügen, also suche ich nach einer Möglichkeit, diese Zeile zu ändern: "script.sh >> / var / log / logfile "um das Datum anzufügen. - Antonius Bloch
In diesem Fall leiten Sie die Ausgabe Ihres Skripts an eine Named Pipe um und lassen Sie einen Daemon auf die Ausgabe warten, der die Skriptausgabe übernimmt und ein Datum hinzufügt, bevor er in eine Protokolldatei geschrieben wird. Sie können wahrscheinlich die ändern Skript schrieb ich hier, um das zu tun. Ich würde es tun, weil es mich interessiert, aber es ist spät in Großbritannien und ich habe einen frühen Start morgen. - Iain


Mach ein config.sh Datei

#!/usr/bin/env bash
LOGFILE="/path/to/log.log"
TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`

Wenn Sie zur Verwendung der Protokolldatei senden müssen

#!/usr/bin/env bash
source /path/to/config.sh

echo "$TIMESTAMP Say what you are doing" >> $LOGFILE

do_what_you_want >> $LOGFILE

Log-Datei sieht wie folgt aus

2013-02-03 18:22:30 Say what you are doing

So wird es leicht sein, nach Datum zu sortieren


7
2017-09-12 20:34



Ihr '' config.sh '' wird '' date '' genau einmal auf '' source ... / config.sh '' ausführen. - clacke


Du meinst wie:

(date && script.sh) >> /var/log/logfile

5
2018-04-27 16:45



Mein Gott, Leute, jeder macht einen Tick-Ersatz, Named Pipes, etc. Einfach den Datumskommando und das Skript in Parens einschließen! Der Typ, der die Funktion hat, hat einen legitimen Fall, wenn es mehrzeilige Ausgaben gibt und das Protokoll mit dem Datum in jeder Zeile hübsch aussehen muss, aber die meisten dieser Lösungen sind Overkills, die keine Shell-Semantik verwenden. - cjc
Das fügt den Zeitstempel nur einmal pro Ausführung hinzu script.sh. Das OP benötigt einen Zeitstempel pro Zeile. - Dave Forgac
obwohl dies die OP-Frage nicht beantwortet, fand ich noch nützliche Informationen. - User


Versuche dies

timestamp()
{
 date +"%Y-%m-%d %T"
}

Rufen Sie diese Zeitstempelfunktion in jedem echo-Befehl auf:

echo "$(timestamp): write your log here" >> /var/log/<logfile>.log

3
2017-11-09 22:24



@ shabbot: Danke für die Bearbeitung, das war ein Tippfehler, ich habe es nicht bemerkt. - Sanjay Yadav