我正在使用 systemd 管理 Ubuntu 16 上的一个程序。我似乎无法从程序中获取日志以输出到journalctl
或/var/log/syslog
。journald 配置是默认配置,它至少应该将所有日志消息(<调试)转发到 syslog。以下是 journald 配置:
>> cat /etc/systemd/journald.conf
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See journald.conf(5) for details.
[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitInterval=30s
#RateLimitBurst=1000
#SystemMaxUse=
#SystemKeepFree=
#SystemMaxFileSize=
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=yes
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg
程序定义是:
[Unit]
Description=My Program
After=network.target
[Service]
User=vagrant
Restart=always
WorkingDirectory=/vagrant/transporter
Environment=PORT=8080
ExecStart=/usr/bin/python3.5 catcher.py
当我print
在程序中执行调用时,我没有在journalctl
或中看到任何输出/var/log/syslog
。似乎日志没有命中journalctl
,这是第一个问题,但我不明白如何更改配置以获取这些日志。如果我python3.5 catcher.py
从 shell 手动运行程序( ),我确实会在控制台上看到打印输出。
我尝试过将 ExecStart 改为使用,python3.5 -u
以便不缓冲 stdout,但没有奏效。我还尝试过将 journald.confForwardToConsole
设置更改为 yes,然后重新启动systemd-journald
服务。
任何帮助,将不胜感激。
答案1
我通过使用解决了这个问题python-systemd包装包装如下所述 这篇 stackoverflow 文章。其要点如下:
import logging
from systemd.journal import JournalHandler
log = logging.getLogger('demo')
log.addHandler(JournalHandler())
log.setLevel(logging.INFO)
log.info("sent to journal")
注意,你需要安装操作系统包python-systemd
(例如apt-get install python-systemd
在 Ubuntu 上),而不是 pip 包。显然它们是不同的。