Wenn Sie über Bash- 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)
Ich kann beides stdout
und stderr
auf 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 ( stdout
und stderr
jeweils).
Ich möchte auch die Ausgabe von stdout und stderr auf dem Bildschirm sehen.
Wenn Sie über Bash- 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)
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
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.