请假设有一个应用程序/脚本可以将大量日志数据打印到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.targetjournalctl现在有了所需的数据:
# 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日志的更好方法吗?
正如评论中所建议的那样,我刚刚尝试了-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。
用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发布于 2018-03-11 11:01:09
A目前正在审查请求执行此功能。。
同时,如果您控制与此单元一起运行的脚本,则可以使用python-systemd模块将消息从您的脚本发送到日志,并提供您可能希望的优先级和选项。
https://unix.stackexchange.com/questions/334621
复制相似问题