Wie kann man stdout und stderr mit verschiedenen Tags in syslog aufnehmen?

669
Sparkler

Ich kann beides stdoutund stderrauf logger diese Weise umleiten :

./myprog 2>&1 | tee /dev/tty | logger 

aber ich möchte in der Lage sein, zu markieren, jeden Log - Eintrags mit „ myprog-out“ und „ myprog-err“ auf, wo es herkam ( stdoutund stderrjeweils).

Ich möchte auch die Ausgabe von stdout und stderr auf dem Bildschirm sehen.

0

3 Antworten auf die Frage

2
grawity

Wenn Sie über Funktionen verfügen, können Sie die Prozessersetzung verwenden, um jeden Stream einzeln wie bei einfachen Dateien umzuleiten:

./myprog > >(logger -t myprog-out) 2> >(tee /dev/tty | logger -t myprog-err) 
Das ist sehr nahe an dem, was ich brauche, aber ich sehe nur stderr auf dem Bildschirm, aber nicht stdout (beide protokollieren sich je nach Bedarf in syslog). Sparkler vor 5 Jahren 0
1
Lewis M

Siehe https://stackoverflow.com/questions/9112979/pipe-stdout-and-stderr-to-two-different-processes-in-shell-script

Sie können mit Logger -t die sed ersetzen Tag befiehlt ihnen, um in Systemprotokolldateien zu gehen.

Folgendes habe ich mit dem Beispielskript in der obigen URL gemacht:

#!/bin/bash  foo() { echo a echo b >&2 echo c echo d >&2 }  { foo 2>&1 1>&3 3>&- | logger -t 'my-err'; } 3>&1 1>&2 | logger -t 'my-stdout'  exit 0 

Hoffe das hilft

das scheint auch zu funktionieren: `{./foo 2> & 3 | Logger -t mein-out; } 3> & 1 1> & 2 | Logger -t mein-err`. Was ist die Funktion von 2> & 1 1> & 3 3> & - `in Ihrer Antwort? Sparkler vor 5 Jahren 0
Ich habe verfolgt, was in der URL war. Man sagte, man müsse stdout vorübergehend auf einen anderen Dateideskriptor umleiten, um das Mischen von stderr und stdout zu vermeiden. Lewis M vor 5 Jahren 0
Haben Sie eine Idee, wie Sie auch beide auf dem Bildschirm beibehalten können, während Sie sie protokollieren? Sparkler vor 5 Jahren 0
Sie könnten einen "tee / dev / tty | logger" anstelle von nur logger tun. Das könnte funktionieren. Lewis M vor 5 Jahren 0
0
AFH

Ich habe an der Antwort unten gearbeitet, bin jedoch auf ein Problem gestoßen, das für die anderen Antworten relevant sein könnte, sowie für Probleme, die nicht verwendet werden logger, und zwar mit der Tag-Option. Ich werde meine Ergebnisse einreichen.

Zuerst habe ich gemischte Standardausgabe- und Fehlernachrichten generiert, mit einigen Lücken dazwischen:

echo abc; sleep 1; echo def >&2; sleep 1; echo ghi; sleep 1; echo jkl >&2 

Dann fügte ich out:der Standardausgabemeldung folgende Nachrichten hinzu:

{ echo abc; sleep 1; echo def >&2; sleep 1; echo ghi; sleep 1; echo jkl >&2; } | \ sed 's/^/out: /g'; 

Ich habe dann err:in den Fehlerstrom durch alle Datensätze hinzufügen, entfernen Sie dann die out:Saiten bereits hinzugefügt (beachten Sie, dass, was auch immer Zeichenfolge verwendet wird für out:kein unmodifizierten Fehlerprotokoll beginnen muss):

{ { echo abc; sleep 1; echo def >&2; sleep 1; echo ghi; sleep 1; echo jkl >&2; } | \ sed 's/^/out: /g'; } 2>&1 | sed -e 's/^/err: /g' -e 's/^err: out: /out: /g' 

Die Antwort von Lewis M legt nahe, dass es möglich sein könnte, die Umleitung für Stream 3 zu verwenden, um die doppelte Substitution zu vermeiden. Dies funktioniert jedoch gut mit der obigen Einschränkung. Pufferung bedeutet jedoch, dass die Datensätze nicht notwendigerweise in der Reihenfolge aufgezeichnet werden, in der sie generiert wurden.

stdbuf -i0 -o0 -e0 bash -c \ "{ { echo abc; sleep 1; echo def >&2; sleep 1; echo ghi; sleep 1; echo jkl >&2; } | \ sed 's/^/out: /g'; } 2>&1 | sed -e 's/^/err: /g' -e 's/^err: out: /out: /g'" | \ tee /dev/tty | logger 

Dadurch wird der vorherige Befehl in einer nicht gepufferten Umgebung ausgeführt, dann wird die Ausgabe durchgeleitet tee, sodass sie auf der Konsole angezeigt wird, und dann zum Logger.