celeryの実行でハマったこと2 (loggerが動かない!)
編集中
結論
celeryではloggerに、python loggingモジュールのラッパーを独自に用意している。そのため、呼び出し側のタスクでloggingモジュール(python組込みモジュール)を使用しようとしても、そのままでは競合し利用できない。
taskの中で、get_logger()等の手段(詳細は後述)で"celeryの"loggerを取得し、利用することで競合を回避して動かせるようになる。
背景
タスクの中でimport loggingして、logging.basicconfig(filename='xxx.log')しても、celery経由に切り替えるとlog出力できなくなった。
理由を調べていくと、前述のとおり、celeryでは独自のloggerをloggingモジュールのラッパーとして提供しているため、競合し、そのままでは利用できないことが分かった。
celeryでのloggingモジュールの利用の仕方
celeryのloggerを利用する方法
task内でgetする方法、
taskの外(一番上)でgetする方法、
全然違うところでinitする方法
とかを後で書く。
python組み込みのlogger(logging)を利用する方法
//hijackされるのをFalseにする方法
//とかを後で書く
関連する設定
//logger hijackのはなしとか後で書く
リンク
2012/11/11追記
Celery + Python logging: problems and solutions
http://echorand.me/2012/08/14/celery-and-python-logging/
※上記サイトに記載されている方法で、基本うまくいきます。
ただ、上記サイトに私も追記しましたが以下の対応を行わないとそのままでは動きませんでした。
少なくとも私の環境では、/usr/lib64/python2.6/logging/__init__.pyの「class Filterer:」のclass定義が古い記法(classの継承元にObjectをつけない)のままだと動かないため、「class Filterer(object):」に変更してやる必要がありました。
(他に良い方法をご存知の方いらっしゃれば教えてください。)