systemd am 15.04 protokolliert nicht die Standardausgabe des Geräts

12

Ich versuche gerade, eine systemd-Einheit als Webserver zu erstellen. Derzeit foo.servicesieht meine Datei wie folgt aus:

[Unit]
Description=The Foo Web Server

[Service]
Type=simple
ExecStart=/opt/foo/.cabal-sandbox/bin/foo

[Install]
WantedBy=multi-user.target

Die fooausführbare Datei protokolliert automatisch alle HTTP-Anforderungen in stdout - dies ist gut getestet. Wenn ich jedoch die Protokolle mit ansehe journalctl -u foo, erhalte ich nur die folgende Ausgabe:

...
May 06 17:46:57 localhost systemd[1]: Stopping The Foo Web Server...
May 06 17:46:57 localhost systemd[1]: Started Foo Web Server.
May 06 17:46:57 localhost systemd[1]: Starting The Foo Web Server...
May 06 17:47:08 localhost systemd[1]: Stopping The Foo Web Server...
May 06 17:47:08 localhost systemd[1]: Started The Foo Web Server.
May 06 17:47:08 localhost systemd[1]: Starting The Foo Web Server...

Könnte jemand erklären, warum nicht alle Standardausgaben protokolliert werden? Ich habe mir diese vorherige Frage kurz angesehen , aber sie hilft nicht - sie spielt jedoch auf etwas im Sinne von "... funktioniert möglicherweise nicht für Systeme, die nicht das vollständige System verwenden " an - wäre dies für Ubuntu 15.04 der Fall ? Vielen Dank im Voraus, jede Hilfe dabei wäre sehr dankbar!

Athan Clark
quelle
1
Stellen Sie sicher, dass Ihr Prozess die Ausgabe nicht puffert. Ich hatte ein ähnliches Problem und es wurde behoben, indem die Ausgabepufferung meines Python-Skripts deaktiviert wurde. Da die Anzahl der erstellten Protokolldatensätze nicht hoch war, schien es keine Protokollierung zu geben, aber tatsächlich hatte es noch keine Chance, da sich alle noch im Standardausgabepuffer sammelten.
Jan Vlcinsky
1
Ich versuche auch das zu beheben. Ich habe den Eindruck, dass systemd puffert. stdout ist unter UNIX zeilengepuffert, aber systemd macht sein eigenes Ding und puffert viel mehr (um schnell, aber vielleicht nutzlos zu sein).
Velkan
Ich hatte das gleiche Problem und das Puffern mit Pythons Druckfunktion war das Problem! Da ich Python 3 verwendet habe print('Hello World!', flush=True), habe ich einfach so etwas verwendet und das hat den Trick gemacht! Die Ausgabe wurde in journalctl angezeigt.
Timbram

Antworten:

9

Tatsächlich hängt das Puffern unter UNIX vom Kontext ab: Wenn stdout zu etwas Interaktivem wie einer Konsole umgeleitet wird, wird es normalerweise zeilengepuffert, andernfalls wird es vollständig gepuffert.

Die Pufferung kann innerhalb der Anwendung mit setvbuf geändert werden Bibliotheksaufrufs .

Es kann aber auch mit dem Befehl stdbuf beim Start ausgeführt werden:

ExecStart=/usr/bin/stdbuf -oL /opt/foo/.cabal-sandbox/bin/foo

(für zeilengepufferten Fall)

Velkan
quelle
Das hat mir den Tag gerettet! Vielen Dank. Aber ich bin ein bisschen verwirrt darüber ExecStart=/my/foo/program, warum das Standardprotokoll nicht gelöscht wird, wenn der Dienst beendet wird, sondern stattdessen vollständig verschwindet.
Wlnirvana
0

Unter Ubuntu 15.04 sind systemd- Journale standardmäßig nur flüchtig /run/systemd/journalund bleiben erhalten und gehen bei jedem Neustart verloren. Um ein dauerhaftes systemd- Journal zu verwenden, müssen Sie das /var/log/journalVerzeichnis erstellen (und systemd-journald.service neu starten).

Möglicherweise wird die stdoutAusgabe nur umgeleitet syslogund nicht im systemd- Journal gespeichert . Dafür müssen Sie möglicherweise ein persistentes System verwenden Journal verwenden, wie oben erläutert.

Haben Sie /var/log/syslognach Ihrem fooProtokoll gesucht?

Sonnenwende
quelle
Ich habe das erstellt, /var/log/journalwie Sie erwähnt haben, aber ich sehe ohnehin keinen Standard meines systemd-Dienstes. im /var/log/syslogsehe ich weder es.
Abmelden