Existe uma maneira canônica de obter todos os logs do journalctl desde que um serviço foi reiniciado pela última vez? O que eu quero fazer é reiniciar um serviço e ver imediatamente todos os logs desde que iniciei a reinicialização.
Eu vim com:
$ unit=prometheus
$ sudo systemctl restart $unit
$ since=$(systemctl show $unit | grep StateChangeTimestamp= | awk -F= '{print $2}')
$ sudo systemctl status -n0 $unit && sudo journalctl -f -u $unit -S "$since"
Isso provavelmente funcionará, mas eu queria saber se existe uma maneira mais concreta de dizer: reinicie e me dê todos os logs a partir desse ponto.
Você pode usar o id de invocação , que é um identificador exclusivo para uma execução específica de uma unidade de serviço.
Ele foi introduzido no systemd v232, então você precisa de pelo menos essa versão do systemd para que isso funcione.
Para obter o id de invocação da execução atual do serviço:
E, em seguida, para pesquisar entradas de diário com esse id de invocação anexado a elas:
Descobri que você precisa de INVOCATION_ID e _SYSTEMD_INVOCATION_ID para obter todos os logs. O último é adicionado pelo systemd para saída de logs pela própria unidade (por exemplo, o stdout do processo em execução nesse serviço), enquanto o primeiro é anexado aos eventos obtidos pelo systemd (por exemplo, mensagens "Iniciando" e "Iniciado" para essa unidade. )
Observe que você também não precisa filtrar pelo nome da unidade. Como o id de invocação é exclusivo, a filtragem pelo próprio id é suficiente para incluir apenas os logs do serviço em que você está interessado.
Enquanto aprendi algo novo com a resposta do @filbranden e a aceitei, descobri que a técnica não generaliza. Por exemplo, se eu quiser parar um serviço e ver seus logs de encerramento, essa técnica não funcionará porque um serviço interrompido não possui um invocationID.
Acabei usando uma técnica mais básica --- simplesmente armazenando o tempo antes dos comandos e mostrando todos os logs desde aquele tempo.