systemd le 15.04 ne journalisera pas la sortie standard de l'unité

12

J'essaie actuellement de créer une unité systemd en tant que serveur Web. Actuellement, mon foo.servicefichier se présente comme suit:

[Unit]
Description=The Foo Web Server

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

[Install]
WantedBy=multi-user.target

L' fooexécutable enregistre automatiquement toutes les requêtes HTTP sur stdout - ceci est bien testé. Cependant, lorsque je consulte les journaux avec journalctl -u foo, je n'obtiens qu'une sortie comme celle-ci:

...
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...

Quelqu'un pourrait-il expliquer pourquoi il n'enregistre pas toutes les sorties stdout? J'ai regardé brièvement cette question précédente , mais cela n'aide pas - mais cela fait allusion à quelque chose du genre "... peut ne pas fonctionner pour les systèmes qui n'utilisent pas full systemd" - serait-ce le cas pour Ubuntu 15.04 ? Merci d'avance, toute aide à ce sujet serait très appréciée!

Athan Clark
la source
1
Assurez-vous que votre processus ne met pas en mémoire tampon la sortie. J'avais un problème similaire et il a été résolu en désactivant la mise en mémoire tampon de sortie de mon script python. Comme le nombre d'enregistrements de journaux produits n'était pas élevé, il semblait qu'il n'y ait pas de journalisation, mais en fait, il n'avait encore aucune chance, car tout se rassemblait toujours dans le tampon de sortie standard.
Jan Vlcinsky
1
Essayer de résoudre ce problème aussi. J'ai l'impression que systemd fait du tampon. stdout est mis en mémoire tampon sous UNIX, mais systemd fait sa propre chose et met beaucoup plus en mémoire tampon (afin d'être rapide mais inutile peut-être).
Velkan
J'ai eu le même problème et la mise en mémoire tampon avec la fonction d'impression de Python était le problème! Depuis que j'utilisais Python 3, j'ai juste utilisé quelque chose comme print('Hello World!', flush=True)ça et ça a fait l'affaire! La sortie a commencé à apparaître dans journalctl.
timbram

Réponses:

9

En fait, la mise en mémoire tampon sous UNIX dépend du contexte: lorsque stdout est redirigé vers quelque chose d'interactif comme une console - il est généralement mis en mémoire tampon de ligne, sinon il est entièrement mis en mémoire tampon.

La mise en mémoire tampon peut être modifiée dans l'application à l'aide de l' appel à la bibliothèque setvbuf .

Mais cela peut aussi être fait avec la commande stdbuf au lancement:

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

(pour les cas tampons de ligne)

Velkan
la source
Cela m'a sauvé la journée! Merci beaucoup. Mais je suis un peu confus avec ExecStart=/my/foo/program, pourquoi le journal stdout n'est pas vidé à la fin du service, mais disparaît complètement à la place.
wlnirvana
0

Par défaut sur Ubuntu 15.04 , les journaux systemd ne sont volatils et conservés /run/systemd/journalet sont perdus à chaque redémarrage. Pour utiliser le journal systemd persistant , vous devez créer le répertoire (et redémarrer systemd-journald.service)./var/log/journal

Donc, peut-être, la stdoutsortie est juste redirigée vers sysloget non conservée dans le journal systemd . Pour cela, vous devrez peut-être utiliser un journal systemd persistant comme expliqué ci-dessus.

Avez-vous vérifié /var/log/syslogvotre foojournal?

solstice
la source
J'ai créé le /var/log/journalcomme vous l'avez mentionné, mais je ne vois pas de toute façon la sortie standard de mon service systemd. dans le /var/log/syslogje ne le vois pas non plus.
déconnexion le