Como posso exportar logs para um arquivo a partir do conteúdo de um serviço com o systemd

4

Bem, eu tenho um serviço configurado com systemctl . Este é o arquivo de configuração:

[Unit]
Description=The description of the service (:
After=network.target

[Service]
ExecStartPre=/bin/echo 'Starting Service' >> /var/log/node/myapp.log
ExecStart=/root/.nvm/versions/node/v5.0.0/bin/node ./bin/www
ExecStopPost=/bin/echo 'Stopping Service' >> /var/log/node/myapp.log
Restart=always
#StandardOutput=/var/log/node/myapp.log
#StandardError=/var/log/node/myapp.log
SyslogIdentifier=myapp
Environment=NODE_ENV=production
WorkingDirectory=/home/user/node-apps/theapp

[Install]
WantedBy=multi-user.target

O que eu preciso?:

1) Os ExecStartPre e ExecStopPost poderiam gravar a mensagem 'starting service' ou 'stopping service' no arquivo /var/log/node/myapp.log . Com a configuração acima, não funciona, ele só gera 'Starting Service' >> /var/log/node/myapp.log e 'Stopping Service' >> /var/log/node/myapp.log a journalctl . (Eu verifiquei com journalctl -u myapp )

2) Eu preciso que, em vez de todos os logs do aplicativo, saídas para o journalctl , poderia saída para um arquivo. Ex: /var/log/node/myapp.log . Quer dizer, se no meu aplicativo eu tiver um console.log() , isso pode estar lá.

Com o upstart , posso fazer assim:

script

exec start-stop-daemon --start --make-pidfile --pidfile /var/run/upstart-yourapp.pid --chdir /var/www/yourapp/--chuid user:usergroup --exec /usr/bin/node index.js >> /var/log/yourapp.upstart.log 2>&1

end script

pre-start script
    # Date format same as (new Date()).toISOString() for consistency
    echo "['date -u +%Y-%m-%dT%T.%3NZ'] (sys) Starting" >> /var/log/yourapp.upstart.log
end script

post-stop script
    rm /var/run/upstart-ghost.pid
    echo "['date -u +%Y-%m-%dT%T.%3NZ'] (sys) Stopping" >> /var/log/yourapp.upstart.log
end script

Mas, é possível fazer isso com systemctl ?

    
por robe007 12.11.2015 / 20:30

1 resposta

2

Eu encontrei um problema semelhante. Conforme explicado aqui , você não pode redirecionar a saída diretamente para ExecStartPre , ExecStart ou% ComandosExecStopPost - systemd interpretará os argumentos > ou >> as. A solução é executar seu comando usando sh -c .

Há também um outro problema que tive ao tentar usar o comando date no meu script systemd: %m é um código especial que se refere à ID da máquina do host atual. Portanto, para que a saída seja exibida no mês, você precisa escapar do sinal de porcentagem usando dois sinais de porcentagem ( %% ). Juntando tudo, a versão systemd dos pré e pós-scripts acima é:

# Date format same as (new Date()).toISOString() for consistency
ExecStartPre = /bin/sh -c 'echo "['date -u +%Y-%%m-%dT%T.%3NZ'] (sys) Starting" >> /var/log/yourapp.upstart.log'
ExecStopPost = /bin/sh -c 'rm /var/run/upstart-ghost.pid; echo "['date -u +%Y-%%m-%dT%T.%3NZ'] (sys) Stopping" >> /var/log/yourapp.upstart.log'
    
por 20.12.2016 / 22:23