EL7에서 systemd에 의해 제어되는 서비스의 stdout/error를 가져와 /var/log/messages가 아닌 다른 위치로 보내려면 어떻게 해야 합니까?

EL7에서 systemd에 의해 제어되는 서비스의 stdout/error를 가져와 /var/log/messages가 아닌 다른 위치로 보내려면 어떻게 해야 합니까?

내 사용 사례는 Fabrice A. Marie의 것입니다.systemd를 사용하여 중복 로깅기사(Kibin Labs에서 게시)는 "추악한" 범주에 속하며 전체 ELK 스택("유일한 리조트"라고 함)에 추가하라는 간단한 권장 사항이 포함되어 있습니다. .

Fabrice A. Marie의 분류에 따르면 "좋은" 응용 프로그램은 /dev/null정보 손실 없이 stdout으로 리디렉션할 수 있고 stderr에 거의 쓰지 않으므로 /var/log/messages(systemd 로그를 통해) 많은 양의 로그를 전송할 수 있다는 것입니다. 개인 애플리케이션 유지 로그 파일에 대한 애플리케이션 로깅 메커니즘(systemd 또는 rsyslog로 관리되지 않음) 혹시라도 이건취소내 기준으로는 '좋지' 않은 것을 원한다.

나는 몇 가지 앱을 가지고 있습니다(예를 들어 phantomjs 백엔드 사전 렌더링을 위해 하나를 선택했지만 이것은 단지하나내 사용 사례)는 systemd에서 서비스로 시작됩니다. 내 거응용 프로그램은 로그를 표준 출력 및 표준 오류로 보냅니다(이는 일반적인 기본 동작입니다).console.log()Node.js에서). 것 같다잘못된이것이 "좋은" 자격을 갖추려면 systemd를 사용하는 대신(지금처럼) 자체 개인 로깅을 수행하도록 다시 작성해야 합니다. 어쨌든, 이 앱을 직접 녹음할 수는 없습니다.

Fabrice A. Marie와 내가 읽은 다른 사람들에 따르면 모든 stdout/stderr 정보 /dev/null/var/log/messages. 전체 ELK 스택 없이 내 애플리케이션 로그가 stdout/error에 기록되고 systemd에서 일반적인 방식으로 처리되도록 systemd(및 기타 항목)를 설정할 수 없지만 결국 이와 같은 일이 발생합니까?대신 다른 곳에서/var/log/messages?

CentOS 7 및 RHEL 7을 실행 중이며 현재 샘플 서비스의 서비스 단위는 다음과 같습니다.

[Unit]
Description=prerender
After=network.target
[Service]
ExecStart=/usr/local/bin/node /var/www/prerender/node/server.js
Restart=always
User=prerender
Group=adm
Environment=PATH=/usr/bin:/usr/local/bin PORT=8900
WorkingDirectory=/var/www/prerender/node
[Install]
WantedBy=multi-user.target

답변1

이 기사는 systemd의 악의적인 로깅 기능 인수로 인해 발생하는 문제에 대해 다른 소프트웨어를 비난하는 말도 안되는 것 같습니다. 솔루션(syslog)도 언급하지만 이는 대량 과잉 공격을 제안하는 수단으로만 사용됩니다 logstash.

단일 호스트에 소수의 데몬을 기록하기 위해 Logstash를 사용할 필요는 없습니다.

기사에서 :

기본적으로 이 작업을 수행하면 표준 출력이 로그로 리디렉션됩니다. 기본적으로 로그는 syslog로 차례로 전송되며 RedHat 7 호환 배포판에서는 /var/log/messages에 저장됩니다.

그런 다음 명백하고 합리적인 구성 옵션을 완전히 무시 rsyslogd하고 로그가 수행할 수 없는 작업을 수행하려는 경우 logstash및가 유일한 옵션임을 암시합니다.elasticsearch

rsyslog및 같은 최신 syslog 데몬은 syslog-ng데몬 이름 및 정규식 패턴 일치를 포함한 다양한 기준에 따라 syslog 메시지를 필터링하도록 구성할 수 있습니다. 기본값은 이지만 /var/log/messages기본값을 변경하는 것은 매우 쉽습니다.

따라서 rsyslog서비스에서 syslog 메시지를 필터링하려면 몇 가지 규칙이 필요합니다.


체계적 지지자들이 로깅에 대해 어떻게 생각하든 그들은 로깅이 원시적이고 융통성이 없었기 때문에 필요한 척하기를 좋아하며 journald, 여러 번 해결은커녕 이전에 누구도 고려하지도 않았던 문제를 해결하고 있습니다.

또한 프로그램이 로그를 기록하는 올바른 방법은 stdout이나 stderr이 아니라 대부분의 언어에서 사용할 수 있는 syslog 기능을 사용하는 것입니다.

관련 정보