如何通过Python登录到journald(systemd)?

gue*_*tli 16 python logging systemd

logging.info()想去journald(systemd).

到目前为止,我只发现了读取journald(不是我想要的)的python模块或者像这样工作的模块: journal.send('Hello world')

mar*_*neg 24

python-systemd有一个可以与日志框架一起使用的JournalHandler.

从文档:

import logging
from systemd.journal import JournalHandler

log = logging.getLogger('demo')
log.addHandler(JournalHandler())
log.setLevel(logging.INFO)
log.info("sent to journal")
Run Code Online (Sandbox Code Playgroud)

  • @Federico我找不到设置单位的方法,但你可以执行`JournalHandler(SYSLOG_IDENTIFIER=<id>)`,然后`<id>`用于相应日志条目中的unit/id字段(如果不设置,则默认使用文件名;[参见来源](https://github.com/systemd/python-systemd/blob/a402d08da41413507a4ebebf18de897f7ddf1dd2/systemd/journal.py#L562-L563 ))。但是,这不会创建“<id>”单元,因此“journalctl -u <id>”不会产生任何输出。但是您可以使用“journalctl SYSLOG_IDENTIFIER=<id>”过滤“<id>”消息。 (3认同)

bsc*_*ter 7

作为官方软件包的替代品,systemd软件包可以与python 3.6一起使用.它的来源也在github上.

实现是官方库的镜像,有一些小的改动:

import logging
from systemd import journal

log = logging.getLogger('demo')
log.addHandler(journal.JournaldLogHandler())
log.setLevel(logging.INFO)
log.info("sent to journal")
Run Code Online (Sandbox Code Playgroud)

或者更简短的方法:

from systemd import journal

journal.write("Hello Lennart")
Run Code Online (Sandbox Code Playgroud)


Joe*_*Joe 5

这是一个没有第三方模块的解决方案。它对我来说效果很好,消息显示在日志中。

import logging
import sys

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

# this is just to make the output look nice
formatter = logging.Formatter(fmt="%(asctime)s %(name)s.%(levelname)s: %(message)s", datefmt="%Y.%m.%d %H:%M:%S")

# this logs to stdout and I think it is flushed immediately
handler = logging.StreamHandler(stream=sys.stdout)
handler.setFormatter(formatter)
logger.addHandler(handler)

logger.info('test')
Run Code Online (Sandbox Code Playgroud)

  • 这段代码与journald 没有任何关系。您可能忘记提及您将脚本作为 systemd 服务运行,在这种情况下,systemd 将从程序中收集 stdout 和 stderr 并将其传递给journald,因此您甚至可以使用“print”,它仍然会结束在日记中。 (3认同)