Python で syslog にログ出力
Pythonでログ出力する際に、アプリケーション独自のログを作るとログスイッチなどいろいろ面倒。
なので、syslogに出力する方法を紹介する。
Python で syslog にログを出力する
スーパー簡単。
$ vi syslog-test.py
import syslog
syslog.syslog('hoge')
$ python3 syslog-test.py
こんだけ。結果が、 /var/log/syslog
に出力される。
Oct 21 13:25:03 jitaku-pc syslog-test.py: hoge
syslogにはファイル名が自動で付与されるので、tailする場合はファイル名でgrepするとよい。
tail -f /var/log/syslog | grep syslog-test.py
ログには当然format()も使える(文字列操作の関数なので当たり前だが)。
import syslog
syslog.syslog("num={}".format(num))
あれれー?ログが出てこないぞー?
先ほど作ったプログラムを2回以上連続で動かすと、なぜか1回目しかログが出てきません。
???と思われたかもしれませんが、それはsyslogのデフォルト仕様です。ログの容量削減のためですね。
60秒以内に同じログを出すと出力されないのです。
次の別のメッセージのログが来た時(または一定時間が経過した場合)に、以下のようなログが出てきます。
Oct 21 12:51:11 jitaku-pc syslog-test.py: message repeated 6 times: [ hoge ]
これは同じメッセージが6回きたよ、と省略してしまったんですね。
でもこれはちょっと迷惑です。出力時間が大事だったりする場合もあるので。
なので常に出力するようにするにはメッセージを毎回変える必要があります。
具体的にはメッセージに日時を入れることです。
でもこれはsyslogがデフォルトで日時を入れているのでちょっと気持ち悪いというか無駄な気がします。エレガントでないでがんす。
もしもサーバーの設定をいじってよいのであれば、/etc/rsyslog.conf を編集して毎回出るように変更できます。
$ sudo vi /etc/rsyslog.conf
# Filter duplicated messages
#$RepeatedMsgReduction on
$RepeatedMsgReduction off
$ sudo reboot
と、RepeatedMsgReduction を off にして再起動すれば、syslogは繰り返しのメッセージを削除しません。
ただまぁ自由にサーバーの設定を変えれるケースのほうが少ないと思いますし、日時をメッセージに含める作戦が無難な気もします。
以上‼