memo

2015-11-21

python から journal にログを書き出す

journal というのは systemd のログ機構のこと。 journalctl を使って見るアレ。

systemd の service として python script を動かしておけば、 stdout/stderr にログを出しておくだけでそのまま journal に入る。 でもそれだと例えばエラーログだけに絞り込んで見たいとかが面倒なので、 専用の API を使って付加情報を付けてログを書き出す方法を調べた。

必要なパッケージ

python-systemd パケージが必要。 OS のパッケージマネージャで入れるか、以下のように pip で入れる:

$ pip install https://github.com/systemd/python-systemd/archive/v231.zip

ログの書き出し方

systemd.journald.send() 関数を使う:

from systemd import journal

journal.send('hello world')
journal.send('oops!', PRIORITY=journal.LOG_ERR)

上記スクリプトを実行して、 journal を確認してみる:

$ journalctl --user --since=today
-- Logs begin at Sun 2015-08-23 19:07:47 JST, end at Sat 2015-11-21 00:16:29 JST. --
Nov 21 00:16:29 localhost python[8486]: hello world
Nov 21 00:16:29 localhost python[8486]: oops!
$ journalctl --user --since=today -p err
-- Logs begin at Sun 2015-08-23 19:07:47 JST, end at Sat 2015-11-21 00:16:29 JST. --
Nov 21 00:16:29 localhost python[8486]: oops!

ちゃんとエラーなメッセージだけに絞り込めている。 (実際はエラーなメッセージは赤く表示されている。)

python の logging framework を通して書き出す

python の log handler class 実装が含まれているので、それを使うだけ:

import logging
from systemd import journal

logger = logging.getLogger()
logger.addHandler(journal.JournalHandler())

logger.warn('hello world')
try:
    1/0
except:
    logger.exception('oops!')

実行してまたログを確認:

$ journalctl --user --since=today
-- Logs begin at Sun 2015-08-23 19:07:47 JST, end at Sat 2015-11-21 00:25:39 JST. --
Nov 21 00:25:39 localhost logging-test.py[11723]: hello world
Nov 21 00:25:39 localhost logging-test.py[11723]: oops!
                                                  Traceback (most recent call last):
                                                    File "logging-test.py", line 9, in <module>
                                                      1/0
                                                  ZeroDivisionError: division by zero
$ journalctl --user --since=today -p err
-- Logs begin at Sun 2015-08-23 19:07:47 JST, end at Sat 2015-11-21 00:25:39 JST. --
Nov 21 00:25:39 localhost logging-test.py[11723]: oops!
                                                  Traceback (most recent call last):
                                                    File "logging-test.py", line 9, in <module>
                                                      1/0
                                                  ZeroDivisionError: division by zero

参照: http://www.freedesktop.org/software/systemd/python-systemd/journal.html