프로그램이 시스템 저널 또는 stdout에 기록해야 하는지 감지

프로그램이 시스템 저널 또는 stdout에 기록해야 하는지 감지

RHEL7용 프로그램 제품군을 업데이트 중입니다., 일부. 시스템 서비스로 시작된 경우 시스템 저널에 기록하고 싶습니다. 테스트를 위해 터미널에서 직접 실행되는 경우 대신 stdout에 쓰길 원합니다. 어떻게 하면 가장 우아하게 할 수 있을까요?

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

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

추가 정보:

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

답변1

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

언제~ 아니다저널에 연결하면 (물론) 항상 표준 오류에 작성된 JSON과 같은 항목(객체당 한 줄로)을 사용하여 거기에도 구조화된 로그 레코드를 가질 수 있습니다. RFC 5424에는 (더 제한적인) 구조화된 데이터 옵션도 있습니다.

답변2

systemd문서에 설명된 대로 이미 이 사건을 우아하게 처리했습니다.systemd.exec.

STDOUT에 로그인합니다. systemd를 통해 실행하면 systemd는 기본적으로 STDOUT을 저널로 리디렉션합니다.

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

STDOUT에 로깅하는 것도 모범 사례입니다.12팩터 앱 디자인.

관련 정보