Saya pikir ada cara yang lebih elegan untuk menyelesaikan masalah: mengirim stdout / stderr ke syslog dengan pengenal dan memerintahkan manajer syslog Anda untuk membagi hasilnya dengan nama program.
Gunakan properti berikut di file unit layanan systemd Anda:
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=<your program identifier> # without any quote
Kemudian, dengan anggapan distribusi Anda menggunakan rsyslog untuk mengelola syslog, buat file /etc/rsyslog.d/<new_file>.conf
dengan konten berikut:
if $programname == '<your program identifier>' then /path/to/log/file.log
& stop
Sekarang buat file log dapat ditulis oleh syslog:
# ls -alth /var/log/syslog
-rw-r----- 1 syslog adm 439K Mar 5 19:35 /var/log/syslog
# chown syslog:adm /path/to/log/file.log
Mulai ulang rsyslog ( sudo systemctl restart rsyslog
) dan selamat menikmati! Program Anda stdout / stderr masih akan tersedia melalui journalctl ( sudo journalctl -u <your program identifier>
) tetapi mereka juga akan tersedia di file pilihan Anda.
Sumber melalui archive.org
journalctl -u
masih berfungsi tetapi tidak ada yang dikirim ke file yang ditentukan.~
sudah usang danstop
harus digunakan sebagai gantinya. Perhatikan juga bahwa baris kedua dapat disingkat menjadi& stop
jika keduanya datang setelah satu sama lain./etc/rsyslog.d/<newfile>.conf
isinya menjadi::programname, isequal, "<your program identifier>" /var/log/somelog.log
Berikut ini dokumentasi pada filter rsyslog: rsyslog.com/doc/v8-stable/configuration/filters.html Dan inilah dokumen pada properti sepertiprogramname
: rsyslog.com/doc/master/configuration/properties .htmlrsyslog
memiliki pengguna sendirisyslog
dan harus memiliki akses tulis ke lokasi log. Jadi gunakan yangchown
sesuai. Semoga ini bisa membantu seseorang.Jika Anda memiliki distro yang lebih baru dengan yang lebih baru
systemd
(systemd
versi 236 atau yang lebih baru ), Anda dapat mengatur nilaiStandardOutput
atauStandardError
kefile:YOUR_ABSPATH_FILENAME
.Cerita panjang:
Dalam versi yang lebih baru
systemd
ada opsi yang relatif baru ( permintaan github berasal dari 2016 ish dan peningkatannya digabung / ditutup 2017 ish ) di mana Anda dapat mengatur nilaiStandardOutput
atauStandardError
kefile:YOUR_ABSPATH_FILENAME
. Thefile:path
opsi didokumentasikan dalam terbarusystemd.exec
halaman manual .Fitur baru ini relatif baru dan tidak tersedia untuk distro lama seperti centos-7 (atau centos sebelumnya).
sumber
copytruncate
dilogrotate
.Anda mungkin mendapatkan kesalahan ini:
Dari
systemd.exec(5)
halaman manual:The
systemd.exec(5)
man page menjelaskan pilihan lain yang terkait dengan penebangan. Lihat jugasystemd.service(5)
dansystemd.unit(5)
manusia halaman.Atau mungkin Anda dapat mencoba hal-hal seperti ini (semuanya dalam satu baris):
sumber
journalctl -u your-unit-name
.The fd option connects the output stream to a single file descriptor provided by a socket unit. A custom named file descriptor can be specified as part of this option, after a ":" (e.g. "fd:foobar").
2>&1 > /var/log.log
untuk ini:2>&1 >> /var/log.log
. Terima kasihSaya akan menyarankan menambahkan
stdout
danstderr
file dalamservice
file systemd itu sendiri.Merujuk: https://www.freedesktop.org/software/systemd/man/systemd.exec.html#StandardOutput=
Karena Anda telah mengkonfigurasi, seharusnya tidak suka:
Harus:
Ini berfungsi ketika Anda tidak ingin me-restart layanan lagi dan lagi .
Ini akan membuat file baru dan tidak menambahkan file yang ada.
Gunakan Sebaliknya:
CATATAN: Pastikan Anda sudah membuat direktori. Saya kira itu tidak mendukung untuk membuat direktori.
sumber
file:
rute tersebut berfungsi pada beban pertama layanan, tetapi pada restart berikutnya tidak lagi menulis ke file. Saya mencobaappend:
dari dokumen dan itu tidak berhasil sama sekali.file:
menulis ke awal file setiap kali, dan tidak memotong ... lebih lanjut,append:
tampaknya merupakan tambahan baru (yaitu tidak ada padaman systemd.exec
halaman di Ubuntu 18.04).Jika karena alasan tertentu tidak dapat menggunakan rsyslog, ini bisa dilakukan:
ExecStart=/bin/bash -ce "exec /usr/local/bin/binary1 agent -config-dir /etc/sample.d/server >> /var/log/agent.log 2>&1"
sumber
Asumsikan log sudah dimasukkan ke stdout / stderr , dan login unit systemd
/var/log/syslog
Config rsyslog (Layanan Logging Sistem)
Mulai ulang rsyslog
sumber
Kami menggunakan Centos7, aplikasi boot musim semi dengan systemd. Saya menjalankan java seperti di bawah ini. dan pengaturan StandardOutput ke file tidak berfungsi untuk saya.
Solusi penyelesaian di bawah ini berfungsi tanpa menetapkan StandardOutput. menjalankan java melalui sh seperti di bawah ini.
sumber
Jawaban singkat:
Jika Anda tidak ingin file dihapus setiap kali layanan dijalankan, gunakan tambahkan saja:
sumber