[gelöst] Bash Scripte mit Protokoll (Log) Einträgen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
suleiman
Beiträge: 193
Registriert: 21.12.2016 04:09:41

[gelöst] Bash Scripte mit Protokoll (Log) Einträgen

Beitrag von suleiman » 23.12.2016 00:00:36

Schalom,

wie erstellt man Scripte die Fehler nicht nur z.B. in eine Datei schreiben, sondern auch mit Journalctl aufgelistet werden ?
Es gibt z.B. den Befehl systemd-cat,
dem kann man einen Text übergeben...

Code: Alles auswählen

PRIORITY="notice"	# Acht Status-Meldungen gibt es:  "emerg" (0), "alert" (1), "crit" (2), "err" (3), "warning" (4), "notice" (5), "info" (6), "debug" (7)
TMPFILE="/var/tmp/${0##*/}-$(date +%s).txt"
touch $TMPFILE
echo "Hallo Welt" > $TMPFILE
systemd-cat --priority=$PRIORITY < $TMPFILE
exit 0 
Ausgegeben wird dann folgendes ..

Code: Alles auswählen

root@antec:~# journalctl -b -p notice | tail
...
Dez 22 23:44:26 antec [30134]: Hallo Welt
So weit so gut.

Ich hab aber auch gelesen das systemd-cat an einem Kanal lauschen kann.
tail kann wiederum einen Kanal erstellen.
Aber wenn ich folgendes mache ...

Code: Alles auswählen

PRIORITY="notice"	# Acht Status-Meldungen gibt es:  "emerg" (0), "alert" (1), "crit" (2), "err" (3), "warning" (4), "notice" (5), "info" (6), "debug" (7)
TMPFILE="/var/tmp/${0##*/}-$(date +%s).txt"
touch $TMPFILE
echo "Hallo Welt 2" > $TMPFILE
tail --follow $TMPFILE | systemd-cat --priority=$PRIORITY
echo "Hallo Welt 3" >> $TMPFILE
exit 0
Dann muß ich mit ctrl-c das Script beenden und nix kommt mit journalctl -b -p notice | tail zum vorschein.
Ich weiß ich mach es falsch, aber wie geht es richtig ?

HALP \o/
Zuletzt geändert von suleiman am 28.12.2016 14:44:24, insgesamt 1-mal geändert.

DeletedUserReAsG

Re: Bash Scripte mit Protokoll (Log) Einträgen

Beitrag von DeletedUserReAsG » 23.12.2016 07:01:19

Wäre logger (aus Debianbsdutils) eine Alternative?

Code: Alles auswählen

LOGGER(1)                                                                             User Commands                                                                            LOGGER(1)

NAME
       logger - enter messages into the system log
Ansonsten ist tail -f möglicherweise nicht die richtige Option, die Ausgabe woanders hinzuschreiben, weil’s die Ausgabe selbst nie terminiert und wenn das Script selbst beendet wird, ist auch der Empfänger weg, der das ins Log schreiben könnte.

suleiman
Beiträge: 193
Registriert: 21.12.2016 04:09:41

Re: Bash Scripte mit Protokoll (Log) Einträgen

Beitrag von suleiman » 23.12.2016 12:31:38

Es funktioniert überhaupt nicht mit tail, da wird nicht mal eine Nachricht an systemd-cat übergeben.
Oder hätte ich vieleicht die Nachrichten umlenken sollen z.B. 1>&2 oder so in der Art.

Ich hab auch schon mir gedacht das ich mit einem andern Tool weiter komme.
Logger sieht mal genau richtig aus und da geht ja noch viel viel mehr.

Was ich oben probiert habe geht warscheinlich mit folgenden Befehl ...

Code: Alles auswählen

Logger --file {$TMPFILE} # Log the contents of the specified file.  This option cannot be combined with a command-line message.
Danke vielmals!11
Ich werde wohl mit dem Tool viel arbeiten und rum probieren.


Nachtrag:
Gibt es irgend welche Richtlinien wie man einen Log-Eintrag erstellen sollte ?
z.B. Datum + Script Name + Befehl + usw..

inne
Beiträge: 3273
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Bash Scripte mit Protokoll (Log) Einträgen

Beitrag von inne » 23.12.2016 13:02:41

Du könntest für logger(1) noch den Schalter -t $0 setzen.

Dann bekommst du Logeinträge wie diesen:

logger -t $0 foo
cat /var/log/syslog
...
Dec 23 13:01:17 mydebian bash: foo

suleiman
Beiträge: 193
Registriert: 21.12.2016 04:09:41

Re: Bash Scripte mit Protokoll (Log) Einträgen

Beitrag von suleiman » 23.12.2016 14:21:38

cool thx.

suleiman
Beiträge: 193
Registriert: 21.12.2016 04:09:41

Re: Bash Scripte mit Protokoll (Log) Einträgen

Beitrag von suleiman » 28.12.2016 14:41:59

Danke nochmals allen, dass ihr mir das Programm zum loggen gezeigt habt.

Nach vielen Tests hier die ultimative Lösung, welche in vielen Scripts übernommmen werden kann.
Warscheinlich die coolste Code-Zeile welche ich jeh benutzen werde.

Es folgt ein Beispiel...

Code: Alles auswählen

#!/bin/bash
# Dies ist ein Beispiel um Meldungen ans Protokoll zu übergeben.
# Acht Status-Meldungen gibt es:  "emerg" (0), "alert" (1), "crit" (2), "err" (3), "warning" (4), "notice" (5), "info" (6), "debug" (7)

exec 1> >(logger -i -s -t $0 -p 6 --prio-prefix) 2>&1	# Alle Meldungen zuerst ans Protokoll weiterleiten und dann in der Console ausgeben (Um ausdrucksvolle Protokolleinträge zu erzeugen wird zusätzlich die Priorität, der Name vom Script, und die Prozess Identifikation verwendet)

echo "Hallo Welt"			# Text wird an logger weitergeleitet 
echo "<5>Hallo Welt (Status: Notiz)"	# Text wird an logger weitergeleitet
echo "<3>Hallo Welt (Status: Fehler)" 1>&2	# Text wird an logger weitergeleitet
exit 0					# Script beenden
Wenn ich es richtig verstanden habe dann simuliert der Code >() eine Datei, und so kann man die coolsten Kanäle machen!11

Man könnte es noch viel weiter treiben mit z.B. dem json-Format,
aber dies ist schon alles was ich benötige.

Dies ist natürlich nicht auf meinem Mist gewachsen!
Kudos gehn an ...
Pretty much the best thing ever you could put at the top of your bash script: exec 1> >(logger -s -t $(basename $0)) 2>&1

--Eric Lindvall (@lindvall) September 8, 2014

Antworten