프로그램이 시스템 로그 또는 표준 출력에 기록해야 하는지 여부를 감지합니다.

프로그램이 시스템 로그 또는 표준 출력에 기록해야 하는지 여부를 감지합니다.

RHEL7용 프로그램 세트를 업데이트하고 있는데 그 중 일부는, 일부. systemd 서비스로 시작되면 systemd 로그에 쓰길 원합니다. 예를 들어 테스트를 위해 터미널에서 직접 실행되는 경우 표준 출력에 쓰길 원합니다. 어떻게 하면 가장 우아하게 할 수 있을까요?

로깅 심각도, 파일 이름, 줄 번호, 스레드 이름 등 로깅의 고급 기능을 활용하고 싶습니다. 따라서 단순히 stdout에 쓰는 것만으로는 충분하지 않습니다.

내가 검색한 결과 프로세스의 상위 PID를 확인하거나 해당 cgroup을 확인하라는 제안이 나왔습니다. 더 좋은 방법이 있나요? 이는 서투른 해결책처럼 보일 수 있습니다. 이상적으로는 호출할 수 있는 함수나 확인할 환경 변수가 있을 것입니다.

추가 정보:

(나의 대체 계획은 명령줄 스위치를 사용하는 것이지만 자동 감지는 확실히 좋을 것입니다.)

답변1

systemd 버전 231에서는 JOURNAL_STREAM이러한 목적으로 환경 변수가 도입되었습니다. 프로그램은 해당 값을 확인하고 해당 값을 표준 오류의 장치 및 inode 번호와 비교한 다음 그에 따라 동작을 변경합니다.

언제아니요로그에 연결되면 (물론) 언제든지 JSON(객체당 한 줄)을 사용하여 표준 오류에 쓸 수 있으므로 거기에도 구조화된 로깅이 있습니다. RFC 5424에는 구조화된 데이터에 대한 (더 제한적인) 옵션도 있습니다.

답변2

systemd이 상황은 에 설명된 대로 이미 적절하게 처리되었습니다.시스템 실행 프로그램.

표준 출력에 기록합니다. systemd를 통해 실행할 때 systemd는 기본적으로 STDOUT을 로그로 리디렉션합니다.

또 다른 옵션은 journal+console항상 둘 다에 로그인하려는 경우입니다.

STDOUT에 로깅하는 것도 모범 사례입니다.앱 디자인의 12가지 요소.

관련 정보