Ich habe ein ständig laufendes Skript, das ich in eine Protokolldatei ausgebe:
script.sh >> /var/log/logfile
Ich möchte vor jeder Zeile, die an das Protokoll angehängt wird, einen Zeitstempel einfügen. Mögen:
Sat Sep 10 21:33:06 UTC 2011 The server has booted up. Hmmph.
Gibt es ein Jujitsu, das ich verwenden kann?
Antworten:
Sie können die Ausgabe des Skripts durch eine Schleife leiten, die dem aktuellen Datum und der aktuellen Uhrzeit vorangestellt ist:
Wenn Sie dies häufig verwenden, ist es einfach, eine Bash-Funktion zum Behandeln der Schleife zu erstellen:
quelle
read
Leerzeichen am Anfang und am Ende der Zeile abgeschnitten werden. Es setzt IFS (Bashs Internal Field Separator, im Grunde eine Liste von Whitespace-Zeichen) auf leer für denread
Befehl.echo
Escape-Sequenzen interpretieren. Wenn Sie wirklich möchten, dass der Inhalt nicht verfälscht wird (außer das Hinzufügen von Datumsangaben), ersetzen Sie denecho
Befehl durchprintf "%s %s\n" "$(date)" "$line"
date -u +"%Y-%m-%dT%H:%M:%SZ"
oder vielleicht mehr rechtdate +"%Y-%m-%d %T"
.date
für jede Protokollzeile ein neuer Prozess erzeugt (ausgeführt ). Dies kann je nach Computer und Anzahl der Protokolle ein schwerwiegender Nachteil sein. Ich würde eher vorschlagen , zu verwenden ,ts
wenn vorhanden, siehe die Antwort von @willemSiehe
ts
aus dem Ubuntu-moreutils
Paket:Oder, wenn
$command
automatische Pufferung (erfordertexpect-dev
Paket):quelle
Der Datumsbefehl liefert diese Informationen
also kannst du
ist es das was du wolltest ?
quelle
Sie können einfach echo den Befehl gibt an die Log - Datei. dh
Es funktioniert wirklich :)
Beispiel:
quelle
Machen Sie eine
config.sh
DateiWenn Sie senden müssen, um die Protokolldatei zu verwenden
Protokolldatei sieht aus wie
So ist es einfach, nach Datum zu sortieren
quelle
Du meinst wie:
quelle
script.sh
. Das OP benötigt einen Zeitstempel pro Zeile.Versuche dies
Rufen Sie diese Zeitstempelfunktion in jedem Echo-Befehl auf:
quelle
Die akzeptierte Antwort https://serverfault.com/a/310104 kann etwas langsam sein, wenn viele Zeilen verarbeitet werden müssen, wobei der Aufwand für das Starten des
date
Prozesses in Ubuntu etwa 50 Zeilen pro Sekunde und nur etwa 10 zulässt -20 in Cygwin.Wann
bash
kann eine schnellere Alternative angenommen werden, wäre dasprintf
eingebaute mit seinem%(...)T
Formatbezeichner. Vergleichen Siequelle
Sie könnten feststellen, dass awk schnell läuft,
Aber sed läuft viel schneller,
Bei näherer Betrachtung scheint sich die Zeit jedoch nicht zu ändern.
quelle
"s/^/$(date -R) /"
die das Datum einmal vor dem Sed bewertet und ausführt. Sed wird eine statische Zeichenfolge übergeben.yes | head -5000000 | while read line; do echo $((SECONDS)); done | uniq -c
ist viel langsamer als Gawk.ts
Das Dienstprogramm hat eine ähnliche Leistung wie die Bash-Schleife.yes |head -5000000 |perl -ne 'print localtime."\t".$_' |uniq -c
ist etwas langsamer als awk.Das Folgende ist der Inhalt meiner Protokolldatei
Einige meiner Shell-Inhalte sind wie folgt
quelle
Dieses Skript druckt die Ausgabe im Terminal und speichert sie auch in einer Protokolldatei.
Beispielausgabe:
quelle
Eine andere Möglichkeit besteht darin, eine Funktion einzurichten, die jedes Mal aufgerufen wird, wenn Sie Daten in Ihrem Code ausgeben möchten:
Anschließend möchten Sie den Code jedes Mal an den Protokolldateiaufruf senden
Kinderleicht....
quelle
Pipe ein "sed":
quelle