Eu acho que existe uma maneira mais elegante de resolver o problema: envie o stdout / stderr para o syslog com um identificador e instrua seu gerenciador de syslog a dividir sua saída pelo nome do programa.
Use as seguintes propriedades no arquivo da unidade de serviço systemd:
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=<your program identifier> # without any quote
Supondo que sua distribuição esteja usando o rsyslog para gerenciar os syslogs, crie um arquivo /etc/rsyslog.d/<new_file>.conf
com o seguinte conteúdo:
if $programname == '<your program identifier>' then /path/to/log/file.log
& stop
Agora torne o arquivo de log gravável por 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
Reinicie o rsyslog ( sudo systemctl restart rsyslog
) e divirta-se! Seu programa stdout / stderr ainda estará disponível no journalctl ( sudo journalctl -u <your program identifier>
), mas eles também estarão disponíveis no seu arquivo de escolha.
Fonte via archive.org
journalctl -u
ainda funciona, mas nada é enviado para o arquivo especificado.~
está obsoleto estop
deve ser usado em seu lugar. Observe também que a segunda linha pode ser reduzida para& stop
se as duas vierem uma após a outra./etc/rsyslog.d/<newfile>.conf
conteúdo para::programname, isequal, "<your program identifier>" /var/log/somelog.log
Aqui está a documentação sobre os filtros rsyslog: rsyslog.com/doc/v8-stable/configuration/filters.html E aqui estão os documentos sobre as propriedades comoprogramname
: rsyslog.com/doc/master/configuration/properties .htmlrsyslog
possui seu próprio usuáriosyslog
e que ele precisa ter acesso de gravação ao local dos logs. Então use emchown
conformidade. Espero que isso ajude alguém.Se você tiver uma distribuição mais nova com uma mais nova
systemd
(systemd
versão 236 ou mais recente ), poderá definir os valores deStandardOutput
ouStandardError
parafile:YOUR_ABSPATH_FILENAME
.Longa história:
Nas versões mais recentes de,
systemd
existe uma opção relativamente nova ( a solicitação do github é de 2016 ish e o aprimoramento é mesclado / fechado 2017 ish ) onde você pode definir os valores deStandardOutput
ouStandardError
parafile:YOUR_ABSPATH_FILENAME
. Afile:path
opção está documentada na página do manual mais recentesystemd.exec
.Esse novo recurso é relativamente novo e, portanto, não está disponível para distros mais antigos, como o centos-7 (ou qualquer outro cento anterior).
fonte
copytruncate
noslogrotate
.Você pode receber este erro:
Na
systemd.exec(5)
página do manual:A
systemd.exec(5)
página do manual explica outras opções relacionadas ao log. Veja também as páginas de manualsystemd.service(5)
esystemd.unit(5)
.Ou talvez você possa tentar coisas como esta (todas em uma linha):
fonte
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
a isto:2>&1 >> /var/log.log
. ObrigadoEu sugeriria adicionar
stdout
estderr
arquivar noservice
próprio arquivo systemd .Referência: https://www.freedesktop.org/software/systemd/man/systemd.exec.html#StandardOutput=
Como você configurou, não deve gostar:
Deveria ser:
Isso funciona quando você não deseja reiniciar o serviço repetidamente .
Isso criará um novo arquivo e não será anexado ao arquivo existente.
Use em vez disso:
NOTA: Certifique-se de criar o diretório já. Eu acho que não suporta criar um diretório.
fonte
file:
rota funciona na primeira carga do serviço, mas nas reinicializações subsequentes, ela não grava mais no arquivo. Eu tenteiappend:
com os documentos e isso não funcionou.file:
grava no início do arquivo todas as vezes e não trunca ... além disso,append:
parece ser uma nova adição (ou seja, não está presente naman systemd.exec
página do Ubuntu 18.04).Se, por algum motivo, não puder usar o rsyslog, isso será feito:
ExecStart=/bin/bash -ce "exec /usr/local/bin/binary1 agent -config-dir /etc/sample.d/server >> /var/log/agent.log 2>&1"
fonte
Suponha que os logs já estejam colocados no stdout / stderr e tenham o log da unidade systemd
/var/log/syslog
Config rsyslog (Serviço de Log do Sistema)
Reinicie o rsyslog
fonte
Estamos usando o Centos7, aplicativo de inicialização com systemd. Eu estava executando o java como abaixo. e definir StandardOutput para arquivo não estava funcionando para mim.
Solução abaixo da solução alternativa funcionando sem definir o StandardOutput. executando java através de sh como abaixo.
fonte
Resposta curta:
Se você não deseja que os arquivos sejam limpos toda vez que o serviço for executado, use o anexo:
fonte