Olá a todos. Para um projeto estou rodando um código em python como serviço do systemd e eu gostaria de salvar logs em tempo real em arquivos de texto. No entanto, não estou conseguindo fazer com que isso funcione
1 - Já tentei importando a biblioteca logging. Quando executo o código com python3 nome.py até funciona, mas rodando como serviço ele funciona certo mas simplesmente não escreve nada
2 - Já tentei usando o modo padrão do python de abrir arquivos de texto, quando rodo o código com python3 nome.py até funciona, mas desse jeito o serviço nem roda, dá erro como se não tivesse permissões
3 - Já coloquei no arquivo o ExecStart escrito desse modo:
ExecStart = /home/pasta/codigo.py > /home/pasta/arquivo.txt
*Já tentei com >> também
Nesses casos o serviço funciona normalmente mas também não salva nada no arquivo texto.
4 - Os logs chegam normalmente se eu executar o comando
journalctl -u nomedoservivo.service
E se eu der esse comando com um > texto.txt depois funciona normalmente. Mas eu gostaria de salvar os logs em tempo real e num arquivo específico
Obs.: No arquivo meuservico.service já tentei colocar User = root para todas tentativas acima e não funcionou.
Agradeço se alguém puder ajudar.
tenta as opções
StandardOutput=
StandardError=
exemplo
ExecStart = /home/pasta/codigo.py
StandardOutput= /home/pasta/arquivo.txt
StandardError= /home/pasta/arquivo1.txt
pelo manual do systemd
systemd.default_standard_output=, systemd.default_standard_error=
Controls default standard output and error output for services and sockets. That is, controls the default for StandardOutput= and
StandardError= (see systemd.exec(5) for details). Takes one of inherit, null, tty, journal, journal+console, kmsg, kmsg+console. If the
argument is omitted systemd.default-standard-output= defaults to journal and systemd.default-standard-error= to inherit.
Segundo a página do systemd na FreeDesktop, não basta só colocar o nome do arquivo. Seria assim na verdade:
ExecStart = /home/pasta/codigo.py
StandardOutput=file:/home/pasta/arquivo.txt
StandardError=file:/home/pasta/arquivo1.txt
Isso apaga e reescreve os arquivos a cada vez que o programa é iniciado. Para ir acumulando ao fim do arquivo:
ExecStart = /home/pasta/codigo.py
StandardOutput=append:/home/pasta/arquivo.txt
StandardError=append:/home/pasta/arquivo1.txt
Outra possível solução, que torna possível usar o >
(substituir) e o >>
(acrescentar ao final), seria, em vez de iniciar diretamente o script do Python, primeiro iniciar um shell.
ExecStart=sh -c '/home/pasta/codigo.py >> /home/pasta/arquivo.txt 2>> /home/pasta/arquivo1.txt'
A coisa correta a fazer é usar o journald, usando um JournaldLogHandler Você vai precisar do pacote de desenvolvimento do systemd, não sei que distro usa, no caso uso fedora:
sudo dnf install systemd-devel
pip instal systemd
Agora se você pretende escrever em um arquivo separado de qualquer forma. Se for um serviço para user space, eu aconselho utilizar o suporte a user session do systemd:
mkdir -p $HOME/.local/share/systemd/user/
pythond.service:
Resumo
[Unit]
Description=um programa com logger em python.
[Service]
Type=simple
TimeoutStartSec=0
ExecStart=python /home/pasta/pythond.py
[Install]
WantedBy=default.target
pythond.py:
Resumo
# formater para o handler
f = ("%(levelname)8s:%(message)s: ")
# rotating file handler
# delay - apenas abre arquivo quando alguma mensagem é emitida
# você deve ter permição para escrever no diretório, use um caminho absoluto.
file_handler = RotatingFileHandler('/home/pasta/file.log',
delay=True, backupCount=5)
file_handler.setFormatter(logging.Formatter(f))
file_handler.doRollover()
# obtem root logger, você deve definir o level do logger
# dependendo do level do logger a mensagem pode ser ignorada pelo logger.
log = logging.getLogger()
log.addHandler(file_handler)
log.setLevel(logging.INFO)
log.info("testando o logger!")
log.debug("testando o logger!") #não vai escrever
1 curtida