예: '멋진 앱'

예: '멋진 앱'

우리는 앱을 실행하는 프로세스에 로그를 남기고 로그 에 stdout대해서만 로그인하는 많은 프로덕션 앱(자사 및 타사)을 보유하고 있습니다 (즉 , 2개의 로그 우선순위만: ).INFOstderrERRORINFO|ERROR

앱에 대한 시스템 서비스 단위를 사용하면 다음과 같이 설정할 수 있습니다.

StandardOutput=journal
StandardError=journal

이를 통해 DevOps는 중앙 집중식 로그 수집을 용이하게 하고 무엇이든 모니터링하기 위해 시스템 장치와 저널을 통해 모든 것을 관리할 수 있으며 배포하는 모든 앱에 대해 다양한 형식/위치의 다양한 로그를 찾고 구문 분석하는 것에 대해 걱정할 필요가 없습니다.

systemd의 저널에는 syslog의 7레벨 메시지 우선순위 시스템과 호환되는 메시지 우선순위 시스템이 있습니다. INFO은 수준 6이고 ERROR수준입니다 3. 자세한 내용은 참고 자료를 참조하세요.

문제는... systemd/journal이 stdout과 stderr에서 저널에 기록된 메시지를 구별하지 못하는 것 같습니다. stdout 및 stderr 메시지는 모두 기본 우선순위 6( INFO) 으로 저널에 기록됩니다 .

예: '멋진 앱'

/opt/log-test.sh

#!/bin/bash

echo "This is ERROR" 1>&2
echo "This is INFO"

exit 0

/etc/systemd/system/log-test.service

[Unit]
Description=log test for journal

[Service]
Type=simple

ExecStart=/opt/log-test.sh

StandardOutput=journal
StandardError=journal
SyslogIdentifier=log-test

그것을 실행하고 일지를 확인하십시오

$ systemctl start log-test
$ journalctl -u log-test
-- Logs begin at Thu 2022-04-07 08:17:16 UTC, end at Thu 2022-04-07 16:35:02 UTC. --
Apr 07 16:34:58 host.example.com systemd[1]: Started log test for journal.
Apr 07 16:34:58 host.example.com log-test.sh[29909]: This is ERROR
Apr 07 16:34:58 host.example.com log-test.sh[29909]: This is INFO
$ journalctl -u log-test -p 6   # syslog info priority
-- Logs begin at Thu 2022-04-07 08:17:16 UTC, end at Thu 2022-04-07 16:35:08 UTC. --
Apr 07 16:34:58 host.example.com systemd[1]: Started log test for journal.
Apr 07 16:34:58 host.example.com log-test.sh[29909]: This is ERROR
Apr 07 16:34:58 host.example.com log-test.sh[29909]: This is INFO
$ journalctl -u log-test -p 3   # syslog error priority
-- No entries --
$

저널에 기록되면 stderr 및 stdout 메시지 모두 우선순위 6( ) 로 설정되는 것을 볼 수 있습니다 .INFO

stdio->journal이는 기본 로깅 기능으로 사용할 때 stdout과 stderr의 출력을 쉽게 구별할 수 있는 방법이 없기 때문에 문제가 됩니다 .

이것은전에 논의한그리고솔루션가능하지만구현되지 않음. 나는 systemd 팀이 결국 이것을 구현하기를 바라고 있지만 그동안 해결책이 필요합니다.

stdout 및 stderr에 메시지를 기록하여 저널에서 다른 우선순위를 갖도록 하는 합리적인 해결책을 찾은 사람이 있습니까?앱이 로깅을 수행하는 방식을 수정하지 않고?

INFO우리가 배포하는 모든 앱(우리가 작성한 모든 앱은 아님)이 실제로는 (stdout)과 ERROR(stderr) 의 두 가지 수준만 필요할 때 로그 우선순위를 얻기 위해 저널 또는 syslog 통합을 구현해야 하는 것을 원하지 않습니다 .

우리가 배포하는 것의 대부분은 컨테이너화되지 않았으므로 컨테이너의 로깅 기능에 의존하는 것 역시 우리에게 적합한 솔루션이 아닙니다.

stderr 및 stdout이 기본적으로 서로 다른 우선순위로 저널/syslog로 이동하도록 하는 것은 분산 로그 오류 모니터링을 더 쉽게 만드는 데 매우 중요합니다(stderr에 주의가 필요한 항목만 작성하는 것에 대한 좋은 개발자 위생을 가정).

참고자료:

답변1

stdout/ 를 사용해야 하는 경우 stderr다음을 사용할 수 있습니다.sd-daemon 로깅 접두사.

우선순위 로그를 보내려면 앞에 stderr를 붙입니다 .<3>ERRORjournald

log-test.sh및 사용 log-test.service:

#!/bin/bash

>&2 echo "<3>This is ERROR"
echo "This is INFO"

exit 0

그리고 journalctl출력:

$ journalctl -u log-test -p 3
May 02 01:22:58 host.example.com log-test.sh[29909]: This is ERROR

fancy-app에 쓸 API가 있는 경우 이를 사용하여 / 대신 UNIX 데이터그램 (일반적으로 기본적으로 쓰기 가능하고 에 기록 ) syslog에 쓸 수 있습니다 . syslog 태그를 사용하여 필요에 따라 syslog 우선 순위 및 syslog 기능을 식별 합니다 ./dev/logjournaldstdoutstderrfancy-apperrorinfo

예를 들어 Bash에서는 다음을 사용할 수 있습니다.logger:

# emit INFO message to journalctl
$ logger -t fancy-app -u /dev/log -p user.info "This is INFO"

# emit ERROR message to journalctl
$ logger -t fancy-app -u /dev/log -p user.error "This is ERROR"

# show journald messages for fancy-app
$ journalctl -t fancy-app
May 02 01:23:38 host.example.com fancy-app[27302]: This is INFO
May 02 01:23:39 host.example.com fancy-app[27303]: This is ERROR

# show journald ERROR messages for fancy-app
$ journalctl -t fancy-app -p 3
May 02 01:23:39 host.example.com fancy-app[27303]: This is ERROR

대부분의 배포판 journald항목은 일반적으로 로컬 syslog 데몬( syslog-ng, rsyslog, ...)으로 전달되므로 syslog 필터를 확인하거나 local0... local7기능을 사용할 수도 있습니다.

우리는 컨테이너에 로그를 남기고 INFO의 경우 stdout에, ERROR 로그의 경우 stderr에 로그하는 많은 프로덕션 앱(자사 및 타사)을 보유하고 있습니다(즉, 2개의 로그 우선순위: INFO|ERROR).

대부분의 컨테이너 엔진은 syslog에 기록할 수 있어야 합니다. 컨테이너 엔진을 모르고 Docker를 예로 사용하겠습니다.

도커는syslog 로깅 드라이버syslog 형식을 사용하여 모든 syslog 대상에 로그 메시지를 보내는 데 사용할 수 있습니다. 다음과 같은 방법으로 로그인할 수 있어야 합니다 journald.

docker run \
    --log-driver syslog \
    --log-opt syslog-address=unix:///dev/log \
    --log-opt syslog-facility=user \
    --log-opt tag=fancy-app \
    fancy-app:latest

도커도 있다저널 로깅 드라이버사용 가능. 예를 들어:

docker run \
    --log-driver journald \
    --log-opt tag=fancy-app \
    fancy-app:latest

두 로깅 드라이버(시스템 로그그리고저널링)는 stdout및 사이의 분리를 지원합니다 stderr. 즉, 메시지는 우선순위 stdout로 기록되고 메시지는 우선순위로 기록됩니다 .INFOstderrERROR

철학과 불꽃 전쟁은 제쳐두고 실제 syslog에 로그인해 보는 것은 어떨까요? 이는 더 쉽고 텍스트 형식으로 저장되며 일반적으로 로그 관리 소프트웨어에서 지원됩니다(참조그레이로그,로그스태시,종이트레일).

관련 정보