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