systemd 서비스에서 생성된 로그의 소스 프로세스를 확인하는 방법은 무엇입니까?

systemd 서비스에서 생성된 로그의 소스 프로세스를 확인하는 방법은 무엇입니까?

stdout으로 출력되는 여러 타사 프로세스를 시작하는 시스템 서비스가 있습니다. 시스템 로그에서 특정 프로세스의 로그가 무엇인지 쉽게 확인할 수 있는 방법이 있습니까?


최근 systemd에 대해 더 깊이 파고들면서 로깅에 관한 질문이 있습니다. man systemd-journald.service지적했다:

libc syslog(3) 호출을 통해 사용자 프로세스로부터 수신된 로그 정보를 기반으로 구조화된 인덱스 로그를 생성하고 유지하며,시스템 서비스의 표준 입력 및 표준 오류또는 기본 API를 통해.

간단한 서비스를 만들었습니다.

[Service]
ExecStart=/home/myself/logtest/runlogtest

그리고 스크립트가 일부 프로세스를 호출하도록 합니다.

#!/bin/bash

...
/home/myself/logtest/app1 &
/home/myself/logtest/app2 &
...

서비스가 실행되는 동안 다음 명령을 사용하여 메시지를 수신합니다.

journalctl -f | grep runlogtest

출력은 다음과 같습니다(이 예의 경우 app1은 "A"를 출력하고 app2는 "B"를 출력합니다).

Aug 07 14:22:04 localhost.localdomain runlogtest[8742]: B
Aug 07 14:22:07 localhost.localdomain runlogtest[8742]: A
Aug 07 14:22:07 localhost.localdomain runlogtest[8742]: B
Aug 07 14:22:10 localhost.localdomain runlogtest[8742]: B
Aug 07 14:22:11 localhost.localdomain runlogtest[8742]: A
Aug 07 14:22:13 localhost.localdomain runlogtest[8742]: B
Aug 07 14:22:15 localhost.localdomain runlogtest[8742]: A

어쨌든 "A" 로그는 app1에서 온 것이고 "B" 메시지는 app2에서 온 것임을 알 수 있습니까?

지금 당장 볼 수 있는 유일한 해결책은 다음과 같습니다.

  • 각 애플리케이션을 자체 서비스에서 관리합니다(이런 일은 피하고 싶습니다).
  • 프로세스에 대한 래퍼를 만들고 해당 stdout을 캡처하여 syslog를 통해 로그로 펌핑합니다.

답변1

프로세스에 대한 래퍼를 만들고 해당 stdout을 캡처하여 syslog를 통해 로그로 펌핑합니다.

이러한 래퍼는 이미 존재하며 다음과 같이 호출됩니다.systemd-cat.

다음과 같이 사용할 수 있습니다.

systemd-cat -t app1 /home/myself/logtest/app1 &
systemd-cat -t app2 /home/myself/logtest/app2 &

매개변수 -t는 syslog 식별자와 유사(동등)한 임의 식별 문자열입니다.

systemd-cat다음과 같이 셸 파이프라인에서도 사용할 수 있습니다 .

/home/myself/logtest/app1 |& systemd-cat -t app1 &

(이것은 |&stdout 및 stderr을 파이프하는 데 사용되는 bash 구조입니다.)

그러나 추가 프로세스 생성과 기록된 모든 데이터의 추가 복사본 생성을 방지하기 때문에 첫 번째 형식이 더 좋습니다.

관련 정보