Logs de serviço systemd

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