Ich versuche gerade, eine systemd-Einheit als Webserver zu erstellen. Derzeit foo.service
sieht 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 foo
ausfü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!
print('Hello World!', flush=True)
, habe ich einfach so etwas verwendet und das hat den Trick gemacht! Die Ausgabe wurde in journalctl angezeigt.Antworten:
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:
(für zeilengepufferten Fall)
quelle
ExecStart=/my/foo/program
, warum das Standardprotokoll nicht gelöscht wird, wenn der Dienst beendet wird, sondern stattdessen vollständig verschwindet.Unter Ubuntu 15.04 sind systemd- Journale standardmäßig nur flüchtig
/run/systemd/journal
und bleiben erhalten und gehen bei jedem Neustart verloren. Um ein dauerhaftes systemd- Journal zu verwenden, müssen Sie das/var/log/journal
Verzeichnis erstellen (und systemd-journald.service neu starten).Möglicherweise wird die
stdout
Ausgabe nur umgeleitetsyslog
und 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/syslog
nach Ihremfoo
Protokoll gesucht?quelle
/var/log/journal
wie Sie erwähnt haben, aber ich sehe ohnehin keinen Standard meines systemd-Dienstes. im/var/log/syslog
sehe ich weder es.