Saat ini saya mencoba membuat unit systemd sebagai server web. Saat ini, foo.service
file saya terlihat sebagai berikut:
[Unit]
Description=The Foo Web Server
[Service]
Type=simple
ExecStart=/opt/foo/.cabal-sandbox/bin/foo
[Install]
WantedBy=multi-user.target
Yang foo
dapat dieksekusi secara otomatis mencatat semua permintaan HTTP ke stdout - ini diuji dengan baik. Namun, ketika saya melihat log dengan journalctl -u foo
, saya hanya mendapatkan output seperti ini:
...
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...
Bisakah seseorang menjelaskan mengapa itu tidak mencatat semua output stdout? Saya melihat secara singkat pertanyaan ini sebelumnya , tetapi tidak membantu - namun itu menyinggung sesuatu di sepanjang baris "... mungkin tidak bekerja untuk sistem yang tidak menggunakan systemd penuh " - apakah ini akan menjadi kasus untuk Ubuntu 15.04 ? Terima kasih sebelumnya, bantuan apa pun akan sangat dihargai!
print('Hello World!', flush=True)
dan itu berhasil! Output mulai muncul di journalctl.Jawaban:
Faktanya, buffering di UNIX tergantung pada konteks: ketika stdout diarahkan ke sesuatu yang interaktif seperti konsol - biasanya buffer-line, jika tidak buffered sepenuhnya.
Buffering dapat diubah di dalam aplikasi menggunakan panggilan perpustakaan setvbuf .
Tetapi itu juga bisa dilakukan dengan perintah stdbuf saat diluncurkan:
(untuk kasus buffer-line)
sumber
ExecStart=/my/foo/program
, mengapa log stdout tidak memerah ketika layanan dihentikan, tetapi malah benar-benar menghilang.Secara default pada Ubuntu 15.04 , jurnal systemd hanya volatile dan disimpan
/run/systemd/journal
dan hilang pada setiap reboot. Untuk menggunakan jurnal systemd persisten , Anda perlu membuat direktori (dan restart systemd-journald.service)./var/log/journal
Jadi, bisa jadi,
stdout
output hanya diarahkan kesyslog
dan tidak disimpan dalam jurnal systemd . Untuk itu, Anda mungkin perlu menggunakan jurnal systemd persisten seperti dijelaskan di atas.Sudahkah Anda memeriksa log
/var/log/syslog
Andafoo
?sumber
/var/log/journal
seperti yang Anda sebutkan, tapi saya tidak melihat stdout dari layanan systemd saya. di/var/log/syslog
saya tidak melihatnya.