2016-06-02 30 views
43

Bir systemd hizmetinin o/p dosyasını bir dosyaya yeniden yönlendirmeye çalışıyorum, ancak çalışmıyor gibi görünüyor.Sistemd hizmetinin çıktısını bir dosyaya nasıl yönlendirilir

[Unit] 
Description=customprocess 
After=network.target 

[Service] 
Type=forking 
ExecStart=/usr/local/bin/binary1 agent -config-dir /etc/sample.d/server 
StandardOutput=/var/log1.log 
StandardError=/var/log2.log 
Restart=always 

[Install] 
WantedBy=multi-user.target 

bir dosyaya o/p yönlendirmek doğru bir yaklaşım önermek Lütfen

cevap

61

:

Ya da (hepsi bir satırda) bu gibi şeyler deneyebilirsiniz syslog yöneticiniz çıktısını program adına böler.

sizin systemd hizmet birimi dosyasında aşağıdaki özellikleri kullanın:

if $programname == '<your program identifier>' then /path/to/log/file.log 
if $programname == '<your program identifier>' then ~ 
:

StandardOutput=syslog 
StandardError=syslog 
SyslogIdentifier=<your program identifier> # without any quote 

Ardından, dağıtım syslogs yönetmek için rsyslog kullanıyor varsayarak aşağıdaki içerikle /etc/rsyslog.d/<new_file>.conf bir dosya oluşturmak

rsyslog'u (sudo systemctl restart rsyslog) yeniden başlatın ve keyfini çıkarın! Programınız stdout/stderr hala journalctl (sudo journalctl -u) üzerinden erişilebilir olacak, ancak sizin seçtiğiniz dosyada da mevcut olacak.

Kaynak: http://wiki.rsyslog.com/index.php/Filtering_by_program_name

+0

Bir SpringBoot uygulaması için günlüğü yapılandırmak için harika çalışıyor ... –

+3

Ubuntu 16.04. 'journalctl -u 'hala çalışır ancak belirtilen dosyaya hiçbir şey gönderilmez. –

+0

Bu, Debian gerginliği üzerinde harika çalışıyor, ancak '~' kullanımdan kaldırıldığından ve 'dur' yerine kullanılmasından şikayet ediyor. Ayrıca, ikinci satırın birbiri ardına gelmesi durumunda ikinci satırın "durmak için" kısaltılabileceğini de unutmayın. – jlh

18

Muhtemelen bu hatayı alıyorum: şu şekildedir: Yapıyorum systemd.exec(5) adam sayfasından

Failed to parse output specifier, ignoring: /var/log1.log 

:

StandardOutput=

Controls where file descriptor 1 (STDOUT) of the executed processes is connected to. Takes one of inherit , null , tty , journal , syslog , kmsg , journal+console , syslog+console , kmsg+console or socket .

systemd.exec(5) adam sayfası diğer seçenekler r açıklıyor günlüğe kaydetmekten mutluyuz. Ayrıca bkz. systemd.service(5) ve systemd.unit(5) adam sayfaları. Bir tanımlayıcı ile syslog stdout/stderr gönderme ve talimat: Ben sorunu çözmek için daha şık bir yol olduğunu düşünüyorum

ExecStart=/bin/sh -c '/usr/local/bin/binary1 agent -config-dir /etc/sample.d/server 2>&1 > /var/log.log' 
+5

Seçenekler arasında sistemd günlüğüne giriş yapılması önerilir. Dergideki süreciniz için sadece günlükleri 'journalctl -u un-unit-name' kullanarak görüyorsunuz. –

+6

Bir dosya belirtmek için, belgelerin belirttiği şekilde başka bir temizleme seçeneği vardır: 'fd seçeneği, çıktı akışını bir soket birimi tarafından sağlanan tek bir dosya tanıtıcısına bağlar.Özel olarak adlandırılmış bir dosya tanıtıcı, bu seçeneğin bir parçası olarak, bir ":" (ör. "Fd: foobar") sonrasında belirtilebilir. – orion

+2

@orion: Lütfen bunu ayrı bir yanıtlayın. :-) –

4

rsyslog kullanamaz bir nedense, bunu olacaksa: Birlikte daha yeni dağıtımın varsa ExecStart=/bin/bash -ce "exec /usr/local/bin/binary1 agent -config-dir /etc/sample.d/server >> /var/log/agent.log 2>&1"

3

daha yeni systemd (systemd version 236 or newer), ayarlayabilirsiniz StandardOutput veya StandardError ile file:YOUR_ABSPATH_FILENAME arasındaki değerler.


Uzun hikaye: systemd daha yeni sürümlerinde

Eğer file:YOUR_ABSPATH_FILENAME için StandardOutput veya StandardError değerlerini ayarlayabilirsiniz nispeten yeni bir seçenek (the github request is from 2016 ish and the enhancement is merged/closed 2017 ish) bulunmaktadır. file:path seçeneği most recent systemd.exec man page'da belgelenmiştir.

Bu yeni özellik nispeten yenidir ve centos-7 (veya bundan önceki herhangi bir centos) gibi eski dağıtımlarda kullanılamaz.

İlgili konular