서비스 재시작 후 로그 표시

서비스 재시작 후 로그 표시

서비스가 마지막으로 다시 시작된 이후 Journalctl에서 모든 로그를 가져오는 정식 방법이 있습니까? 내가 원하는 것은 서비스를 다시 시작하고 다시 시작이 시작된 이후의 모든 로그를 즉시 확인하는 것입니다.

나는 다음을 생각해 냈습니다.

$ 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"

이것이 효과가 있을 수도 있지만, 재부팅하고 그 시점부터 모든 로그를 제공하라는 좀 더 구체적인 방법이 있는지 궁금합니다.

답변1

당신은 그것을 사용할 수 있습니다통화 ID, 이는 서비스 단위의 특정 실행에 대한 고유 식별자입니다.

그것은소개하다systemd v232에서는 제대로 작동하려면 최소한 해당 버전의 systemd가 필요합니다.

현재 실행 중인 서비스의 호출 ID를 얻으려면:

$ unit=prometheus
$ systemctl show -p InvocationID --value "$unit"
0e486642eb5b4caeaa5ed1c56010d5cf

그런 다음 해당 호출 ID가 추가된 저널 항목을 검색합니다.

$ journalctl INVOCATION_ID=0e486642eb5b4caeaa5ed1c56010d5cf + _SYSTEMD_INVOCATION_ID=0e486642eb5b4caeaa5ed1c56010d5cf

모든 로그를 얻으려면 INVOCATION_ID 및 _SYSTEMD_INVOCATION_ID가 필요하다는 것을 알았습니다. 후자는 장치 자체의 로그 출력(예: 이 서비스에서 실행되는 프로세스의 표준 출력)을 위해 systemd에 의해 추가되는 반면, 전자는 systemd에서 얻은 이벤트(예: 장치의 "Starting" 및 "Has")에 추가됩니다. 시작' 메시지). )

않으니 참고해주세요필요조직 이름으로 필터링할 수도 있습니다. 호출 ID는 고유하므로 ID 자체로 필터링하는 것만으로도 관심 있는 서비스에 대한 로그만 포함하기에 충분합니다.

답변2

@filbranden의 답변에서 새로운 것을 배우고 받아들였지만 그 기술이 일반화되지 않는다는 것을 발견했습니다. 예를 들어, 서비스를 중지하고 해당 종료 로그를 보려는 경우 중지된 서비스에 송장 ID가 없기 때문에 이 기술이 작동하지 않습니다.

나는 보다 기본적인 기술을 사용하게 되었습니다. 단순히 명령 이전의 시간을 저장하고 그 이후의 모든 로그를 표시하는 것입니다.

status_from() { sudo systemctl status -l --no-pager -n0 $1; echo; sudo journalctl -f -u $1 -S "$2"; }
start() { dt=$(date +'%a %Y-%m-%d %T %Z'); sudo systemctl start $1; status_from $1 "$dt"; }
stop() { dt=$(date +'%a %Y-%m-%d %T %Z'); sudo systemctl stop $1; status_from $1 "$dt"; }
restart() { dt=$(date +'%a %Y-%m-%d %T %Z'); sudo systemctl restart $1; status_from $1 "$dt"; }

관련 정보