RHEL7용 프로그램 제품군을 업데이트 중입니다.씨++, 일부자바. 시스템 서비스로 시작된 경우 시스템 저널에 기록하고 싶습니다. 테스트를 위해 터미널에서 직접 실행되는 경우 대신 stdout에 쓰길 원합니다. 어떻게 하면 가장 우아하게 할 수 있을까요?
저널의 고급 기능(로깅 심각도, 파일 이름, 줄 번호, 스레드 이름 등)을 활용하고 싶기 때문에 단순히 stdout에 쓰는 것만으로는 충분하지 않습니다.
내가 수행한 검색 결과 프로세스의 상위 PID를 확인하거나 해당 cgroup을 확인하라는 조언이 나왔습니다. 더 좋은 방법이 있나요? 그것은 멍청한 해결책처럼 보입니다. 이상적으로는 호출할 수 있는 함수나 확인할 환경 변수가 있을 것입니다.
추가 정보:
- 에 대한씨++내가 전화할 프로그램sd_journal_print(3).
- 에 대한자바SLF4J + Logback +를 사용할 계획인 프로그램로그백 저널.
(나의 대체 계획은 명령줄 스위치를 사용하는 것이지만 자동 감지하는 것이 좋을 것입니다.)
답변1
systemd 버전 231에서는 JOURNAL_STREAM
바로 이러한 목적으로 환경 변수가 도입되었습니다. 프로그램은 해당 값을 확인하고 해당 값을 표준 오류의 장치 및 i-노드 번호와 비교한 다음 그에 따라 동작을 변경합니다.
언제~ 아니다저널에 연결하면 (물론) 항상 표준 오류에 작성된 JSON과 같은 항목(객체당 한 줄로)을 사용하여 거기에도 구조화된 로그 레코드를 가질 수 있습니다. RFC 5424에는 (더 제한적인) 구조화된 데이터 옵션도 있습니다.
답변2
systemd
문서에 설명된 대로 이미 이 사건을 우아하게 처리했습니다.systemd.exec.
STDOUT에 로그인합니다. systemd를 통해 실행하면 systemd는 기본적으로 STDOUT을 저널로 리디렉션합니다.
또 다른 옵션은 journal+console
항상 둘 다에 로그인하려는 경우입니다.
STDOUT에 로깅하는 것도 모범 사례입니다.12팩터 앱 디자인.