Journalctl만 사용하여 stderr 로그를 보는 방법은 무엇입니까?

Journalctl만 사용하여 stderr 로그를 보는 방법은 무엇입니까?

많은 양의 로그 데이터를 에 인쇄하는 애플리케이션/스크립트가 있다고 가정하십시오 stdout. 스크립트에서 예상되는 나쁜 상황(예외 처리)이 발생하면 스크립트는 오류를 보고한 다음 stderr하던 작업을 계속합니다.

systemd물론 이 데이터를 수집하여 다음 위치에 넣을 수 있습니다 journal.

# systemctl show sd_test.service | grep 'Standard[OE]'
StandardOutput=journal
StandardError=inherit

내 거 sd_test.service:

[Unit]
Description=A Test Service simply printing to stdout and stderr

[Service]
Type=simple
ExecStart=/home/narunas/sd_test.py

[Install]
WantedBy=multi-user.target

journalctl이제 필요한 데이터가 있습니다.

# systemctl reenable sd_test.service
# systemctl restart sd_test.service
# journalctl -n -u sd_test
-- Logs begin at Fri 2016-11-11 15:49:33 GMT, end at Tue 2017-01-03 19:23:18 GMT. --
Jan 03 19:23:01 dev-box sd_test.py[13183]: This is "stderr": 2
Jan 03 19:23:02 dev-box sd_test.py[13183]: This is "stdout": 2
Jan 03 19:23:03 dev-box sd_test.py[13183]: This is "stderr": 3
Jan 03 19:23:07 dev-box sd_test.py[13183]: This is "stdout": 3
Jan 03 19:23:07 dev-box sd_test.py[13183]: This is "stderr": 4
Jan 03 19:23:11 dev-box sd_test.py[13183]: This is "stdout": 4
Jan 03 19:23:12 dev-box sd_test.py[13183]: This is "stderr": 5
Jan 03 19:23:15 dev-box sd_test.py[13183]: This is "stdout": 5
Jan 03 19:23:17 dev-box sd_test.py[13183]: This is "stdout": 6
Jan 03 19:23:18 dev-box sd_test.py[13183]: This is "stderr": 6

안타깝게도 동일한 라벨이 붙은 _TRANSPORT저널 필드 가 있다는 것을 알고 있습니다 .stderr

표준 출력
서비스의 표준 출력 또는 오류 출력에서 ​​읽는 경우

나는 확실히 내 ExecStart모습을 바꿀 수 있습니다.

ExecStart=/bin/bash -c '/home/narunas/sd_test.py 2> /some/file/path'

journal하지만 파일을 엉망으로 만들기 때문에 이상적이지 않습니다 ...

stderr로그만 보는 더 좋은 방법을 추천해 주실 수 있나요?

편집_1

의견에서 제안한 대로 방금 -o verbose옵션을 시도했습니다.

Tue 2017-01-03 20:23:49.994171 GMT [s=0b15e5c69e2f476eb200d2bdda769465;i=12e28;b=db55b41f61144ae69cc86acfb75209fb;m=42e034d52dc;t=5453672322abb;x=8b696c5447bc2bce]
    PRIORITY=6
    _UID=0
    _GID=0
    _CAP_EFFECTIVE=3fffffffff
    _SYSTEMD_SLICE=system.slice
    _BOOT_ID=db55b41f61144ae69cc86acfb75209fb
    _MACHINE_ID=c5a9e78e2c854065a9b041c58f07c2b2
    _HOSTNAME=dev-box
    SYSLOG_FACILITY=3
    _TRANSPORT=stdout
    SYSLOG_IDENTIFIER=sd_test.py
    _COMM=python3
    _EXE=/usr/bin/python3.5
    _CMDLINE=python3 /home/narunas/sd_test.py
    _SYSTEMD_CGROUP=/system.slice/sd_test.service
    _SYSTEMD_UNIT=sd_test.service
    MESSAGE=This is "stdout": 729
    _PID=13183
Tue 2017-01-03 20:23:52.979981 GMT [s=0b15e5c69e2f476eb200d2bdda769465;i=12e29;b=db55b41f61144ae69cc86acfb75209fb;m=42e037ae22e;t=54536725fba0d;x=8802c0df56848907]
    PRIORITY=6
    _UID=0
    _GID=0
    _CAP_EFFECTIVE=3fffffffff
    _SYSTEMD_SLICE=system.slice
    _BOOT_ID=db55b41f61144ae69cc86acfb75209fb
    _MACHINE_ID=c5a9e78e2c854065a9b041c58f07c2b2
    _HOSTNAME=dev-box
    SYSLOG_FACILITY=3
    _TRANSPORT=stdout
    SYSLOG_IDENTIFIER=sd_test.py
    _COMM=python3
    _EXE=/usr/bin/python3.5
    _CMDLINE=python3 /home/narunas/sd_test.py
    _SYSTEMD_CGROUP=/system.slice/sd_test.service
    _SYSTEMD_UNIT=sd_test.service
    MESSAGE=This is "stderr": 745
    _PID=13183

-o json-pretty와 동일한 결과를 생성 -o verbose하지만 형식이 다릅니다.

내 대본이 멍청하다는 걸 제외하면정보stderr무엇이 무엇 인지 구별할 수 있게 해주는 유용한 것은 없습니다 stdout.

편집_2

그리고 StandardError=journal.

단위:

[Unit]
Description=A Test Service simply printing to stdout and stderr

[Service]
Type=simple
ExecStart=/home/narunas/sd_test.py
StandardError=journal

[Install]
WantedBy=multi-user.target

로그 제어:

# systemctl reenable sd_test.service
# systemctl restart sd_test.service
# journalctl -n -u sd_test -o verbose
Tue 2017-01-03 22:34:55.381341 GMT [s=0b15e5c69e2f476eb200d2bdda769465;i=13ab7;b=db55b41f61144ae69cc86acfb75209fb;m=42fd81d9b7e;t=545384702735d;x=e65570c85dfec1dc]
    _TRANSPORT=stdout
    PRIORITY=6
    SYSLOG_FACILITY=3
    SYSLOG_IDENTIFIER=sd_test.py
    _UID=0
    _GID=0
    _COMM=python3
    _EXE=/usr/bin/python3.5
    _CMDLINE=python3 /home/narunas/sd_test.py
    _CAP_EFFECTIVE=3fffffffff
    _SYSTEMD_CGROUP=/system.slice/sd_test.service
    _SYSTEMD_UNIT=sd_test.service
    _SYSTEMD_SLICE=system.slice
    _BOOT_ID=db55b41f61144ae69cc86acfb75209fb
    _MACHINE_ID=c5a9e78e2c854065a9b041c58f07c2b2
    _HOSTNAME=dev-box
    MESSAGE=This is "stdout": 10
    _PID=21280
Tue 2017-01-03 22:34:57.397880 GMT [s=0b15e5c69e2f476eb200d2bdda769465;i=13ab8;b=db55b41f61144ae69cc86acfb75209fb;m=42fd83c6099;t=5453847213878;x=610237e701d596d4]
    _TRANSPORT=stdout
    PRIORITY=6
    SYSLOG_FACILITY=3
    SYSLOG_IDENTIFIER=sd_test.py
    _UID=0
    _GID=0
    _COMM=python3
    _EXE=/usr/bin/python3.5
    _CMDLINE=python3 /home/narunas/sd_test.py
    _CAP_EFFECTIVE=3fffffffff
    _SYSTEMD_CGROUP=/system.slice/sd_test.service
    _SYSTEMD_UNIT=sd_test.service
    _SYSTEMD_SLICE=system.slice
    _BOOT_ID=db55b41f61144ae69cc86acfb75209fb
    _MACHINE_ID=c5a9e78e2c854065a9b041c58f07c2b2
    _HOSTNAME=dev-box
    MESSAGE=This is "stderr": 11
    _PID=21280
Tue 2017-01-03 22:35:02.403014 GMT [s=0b15e5c69e2f476eb200d2bdda769465;i=13abc;b=db55b41f61144ae69cc86acfb75209fb;m=42fd888bfe7;t=54538476d97c6;x=a6362820cb52ce9]
    _TRANSPORT=stdout
    PRIORITY=6
    SYSLOG_FACILITY=3
    SYSLOG_IDENTIFIER=sd_test.py
    _UID=0
    _GID=0
    _COMM=python3
    _EXE=/usr/bin/python3.5
    _CMDLINE=python3 /home/narunas/sd_test.py
    _CAP_EFFECTIVE=3fffffffff
    _SYSTEMD_CGROUP=/system.slice/sd_test.service
    _SYSTEMD_UNIT=sd_test.service
    _SYSTEMD_SLICE=system.slice
    _BOOT_ID=db55b41f61144ae69cc86acfb75209fb
    _MACHINE_ID=c5a9e78e2c854065a9b041c58f07c2b2
    _HOSTNAME=dev-box
    MESSAGE=This is "stderr": 12
    _PID=21280

답변1

이 기능을 구현하기 위한 풀 요청현재 검토중입니다.

또한 기본적으로 실행되는 스크립트를 제어하는 ​​경우 다음을 사용할 수 있습니다.파이썬 시스템모듈은 원하는 우선순위 및 옵션과 함께 스크립트에서 로그로 메시지를 보냅니다.

답변2

메시지 앞에 <를 붙이면우선 사항> 귀하의 메시지는 이 우선순위에 따라 로그에 기록됩니다. 레벨, 간략한 설명 및 일부 사용 예가 포함된 목록을 찾을 수 있습니다.이 링크에서.

내 컴퓨터에서 이 코드를 컴파일하세요.

#include <cstdio>
#include <thread>
#include <chrono>

const char* pri_msg[] {
    "EMERGENCY",
    "ALERT",
    "CRITICAL",
    "ERROR",
    "WARNING",
    "NOTICE",
    "INFO",
    "DEBUG"
};

int main(){
    int pri = 0;
    while(true) {
        std::printf("<%d>Test service priority level: %s", pri, pri_msg[pri]);
        pri = ++pri % 8;
        std::this_thread::sleep_for(std::chrono::seconds(5));
    }
}

그리고 이를 시스템 서비스로 실행하면 각 메시지가 우선순위에 따라 로그에 기록됩니다.

그런 다음 다음을 사용하여 검색할 수 있습니다 journalctl -u *your-service* -p *priority-level*.

$ journalctl -u testd -p 3
-- Logs begin at mer 2020-10-21 17:31:13 CEST, end at ven 2020-10-23 16:01:01 CEST. --
ott 23 15:57:30 legion testd[21967]: Test service priority level: EMERGENCY
ott 23 15:57:35 legion testd[21967]: Test service priority level: ALERT
ott 23 15:57:40 legion testd[21967]: Test service priority level: CRITICAL
ott 23 15:57:45 legion testd[21967]: Test service priority level: ERROR
ott 23 15:58:10 legion testd[21967]: Test service priority level: EMERGENCY
ott 23 15:58:15 legion testd[21967]: Test service priority level: ALERT
ott 23 15:58:20 legion testd[21967]: Test service priority level: CRITICAL
ott 23 15:58:25 legion testd[21967]: Test service priority level: ERROR
ott 23 15:58:50 legion testd[21967]: Test service priority level: EMERGENCY
ott 23 15:58:55 legion testd[21967]: Test service priority level: ALERT
ott 23 15:59:00 legion testd[21967]: Test service priority level: CRITICAL

귀하의 경우에는 <3>( std::cerr또는 fprintf(stderr, ...).

관련 정보