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