Python で syslog にログ出力するサンプル

Raspberry Pi 2 Model B 上で動かしている Python スクリプトのデバッグを行いたくて、Python 2.x で syslog へロギングする方法を調べた際のメモ。

環境情報

  • Raspberry Pi 2 Model B
  • Raspbian JESSIE (Debian 8.0, Linux Kernel 4.1.17)
  • Python 2.7.9
  • rsyslog 8.4.2

事前準備

/var/log/syslog への出力は SYSLOG プロトコルを使用する。また、ログ出力は再送しない前提で tcp ではなく udp を使うこととする。以下、デフォルトの 514 ポートを開ける設定を行う。

$ sudo netstat -anp | grep 514

上記コマンドで「udp        0      0 0.0.0.0:514             0.0.0.0:*                           28912/rsyslogd」のような結果が出力されなければ 514 番ポートが空いてない。

$ sudo vi /etc/rsyslog.conf

以下の2行の先頭「#」を削除し、コメントイン(設定を有効に)する。

#$ModLoad imudp
#$UDPServerRun 514

保存した後、rsyslog サービスを再起動する。

$ service rsyslog status
$ sudo service rsyslog restart
$ service rsyslog status

上記の netstat コマンドをもう一度実行し、514番ポートが開いていればOK。

作成した Python スクリプト

以下の情報を参考に作成。仮に syslog_sample.py として作成。

How to configure logging to syslog in python? – Stack Overflow
http://stackoverflow.com/questions/3968669/how-to-configure-logging-to-syslog-in-python

ログ出力のための print と import logging はやめてほしい – Qiita
http://qiita.com/amedama/items/b856b2f30c2f38665701

#!/usr/bin/python
# -*- coding: utf-8 -*-

from logging import getLogger, DEBUG
from logging.handlers import SysLogHandler

def _hoge():

    my_logger = getLogger('MyLogger')
    my_logger.setLevel(DEBUG)

    handler = SysLogHandler(address = ('localhost', 514))
    my_logger.addHandler(handler)

    my_logger.debug('this is debug')
    my_logger.critical('this is critical')


if __name__ == "__main__":
    _hoge()

実行権限を与えて実行後、/var/log/syslog に「this is debug」と「this is critical」が出力されていればOK。

さらに詳しく

15.9. logging.handlers — ロギングハンドラ — Python 2.7.13 ドキュメント
http://docs.python.jp/2/library/logging.handlers.html#sysloghandler

yktmnb について

IT土方兼社畜を生業としています。 入社以来 Java を用いた社内向け Web アプリの開発に携わっていました。 最近は IaaS 関連の仕事をしています。 個人的に Android アプリ開発をしたり、ゆるべんという勉強会 (http://wooven.org/) をのんびりとやってます。
カテゴリー: Debian, Python, Raspberry Pi パーマリンク