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 구조입니다.)
그러나 추가 프로세스 생성과 기록된 모든 데이터의 추가 복사본 생성을 방지하기 때문에 첫 번째 형식이 더 좋습니다.