systemd pada 15.04 tidak akan mencatat unit

12

Saat ini saya mencoba membuat unit systemd sebagai server web. Saat ini, foo.servicefile 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 foodapat 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!

Athan Clark
sumber
1
Pastikan, proses Anda tidak buffering output. Saya mengalami masalah yang sama dan itu diselesaikan dengan menonaktifkan buffering output dari skrip python saya. Karena jumlah catatan log yang dihasilkan tidak tinggi, sepertinya tidak ada penebangan, tetapi kenyataannya, belum ada peluang, karena semua masih berkumpul di buffer keluaran stdout.
Jan Vlcinsky
1
Mencoba memperbaikinya juga. Saya memiliki kesan bahwa systemd melakukan buffering. stdout adalah buffer-line di UNIX, tetapi systemd melakukan hal sendiri dan lebih banyak buffer (agar cepat tapi mungkin tidak berguna).
Velkan
Saya memiliki masalah yang sama dan buffering dengan fungsi cetak Python adalah masalahnya! Karena saya menggunakan Python 3 saya hanya menggunakan sesuatu seperti print('Hello World!', flush=True)dan itu berhasil! Output mulai muncul di journalctl.
timbram

Jawaban:

9

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:

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

(untuk kasus buffer-line)

Velkan
sumber
Ini menyelamatkan hari saya! Terima kasih banyak. Tapi aku agak bingung dengan itu ExecStart=/my/foo/program, mengapa log stdout tidak memerah ketika layanan dihentikan, tetapi malah benar-benar menghilang.
wlnirvana
0

Secara default pada Ubuntu 15.04 , jurnal systemd hanya volatile dan disimpan /run/systemd/journaldan hilang pada setiap reboot. Untuk menggunakan jurnal systemd persisten , Anda perlu membuat direktori (dan restart systemd-journald.service)./var/log/journal

Jadi, bisa jadi, stdoutoutput hanya diarahkan ke syslogdan tidak disimpan dalam jurnal systemd . Untuk itu, Anda mungkin perlu menggunakan jurnal systemd persisten seperti dijelaskan di atas.

Sudahkah Anda memeriksa log /var/log/syslogAnda foo?

titik balik matahari
sumber
Saya membuat /var/log/journalseperti yang Anda sebutkan, tapi saya tidak melihat stdout dari layanan systemd saya. di /var/log/syslogsaya tidak melihatnya.
logoff