かぴぶろぐ

またかぴったかと思った・・・(´A`;)

Pylons ログ

カテゴリ[ Python ]

pylonsをpasterで起動している時、コンソールにアクセス情報やsource内のprint等が表示される。
pylonsをpasterで起動する場合、この辺も全てpasterの管理下にあるので、ini次第で色々customできるみたい。
今回はログをcustomしてファイルに保存するようにしてみた。

development.ini

通常このdevelopment.iniが読まれる。名前は何でも良いみたいだが、自分は開発用はdevelopment.ini、scgiで起動する時は別のscgi.ini等作って分けている。

まずはdevelopment.iniに書いた内容。(あくまで設定例です。)

...上はその他のコンフィグ...

#############################
### Logging configuration ###
#############################

[loggers]
#keys = root, routes, kapiapp, sqlalchemy
keys = root, routes, kapiapp, purchase, settlement, test

[handlers]
keys = console, querylog, accesslog, errorlog, settlementlog, testlog

[formatters]
keys = generic

## loger section ###

[logger_test]
level = DEBUG
handlers = testlog
qualname = kapiapp.controllers.member

[logger_purchase]
level = DEBUG
handlers = settlementlog
qualname = kapiapp.controllers.member.purchase

[logger_settlement]
level = DEBUG
handlers = settlementlog
qualname = kapiapp.controllers.settlement

[logger_root]
level = INFO
handlers = console

[logger_routes]
level = INFO
handlers = accesslog
qualname = routes.middleware
# "level = DEBUG" logs the route matched and routing variables.

[logger_kapiapp]
level = DEBUG
handlers = accesslog
qualname = kapiapp

[logger_sqlalchemy]
level = INFO
handlers = querylog
qualname = sqlalchemy.engine
# "level = INFO" logs SQL queries.
# "level = DEBUG" logs SQL queries and results.
# "level = WARN" logs neither.  (Recommended for production systems.)


## handler section ###

[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic

[handler_accesslog]
class = FileHandler
args = ('logs/access.log', 'a')
level = DEBUG
formatter = generic

[handler_errorlog]
class = FileHandler
args = ('logs/error.log', 'a')
level = DEBUG
formatter = generic

[handler_querylog]
class = FileHandler
args = ('logs/query.log','a')
level = DEBUG
formatter = generic

[handler_settlementlog]
class = FileHandler
args = ('logs/settlement.log','a')
level = DEBUG
formatter = generic

[handler_testlog]
class = FileHandler
args = ('logs/test.log','a')
level = DEBUG
formatter = generic

## formatter section ###

[formatter_generic]
format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
datefmt = %H:%M:%S

[loggers]セクション

実際のログをする人の定義。いろんな場所にcustomすると、これが増えてく事になりそう。

[logger_test]
level = DEBUG
handlers = testlog
qualname = kapiapp.controllers.member

このqualnameでどのモジュールを見張るか指定するみたい。
例えばこのkapiapp.controllers.member内で

import logging
log.debug("-- debug --")

と書くとlogger_testに流れてくる。
※但しハンドラも設定しとく必要あり。

[handlers]セクション

その名の通りハンドラなんだが、コンソールに出すか、どっかのファイルに出すかとか、設定する。

[handler_testlog]
class = FileHandler
args = ('logs/test.log','a')
level = DEBUG
formatter = generic

実際ハンドラとloggersは一対多みたいな関係なので、testlogって名前は微妙です・・。
accesslogとかerrorlogってのがあってそこに、複数のloggerから流し込むのが正しいか・・。

[formatters]セクション

keys = generic以外知らん。他にもあるんだろうけど、genericで事足りてる。

[formatter_generic]
format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
datefmt = %H:%M:%S

ま、これはこのままで良いかと。

 

[handler_console]でpaster serve実行時にログが流れてくるんだが、どうもまだ上記の設定では複数箇所にログが入ってきてしまう。きちんとは分け切れてない・・・。
恐らくlevel = DEBUGって所と[logger_routes]をもっとよく見れば色々最適化出来そう。
後、loggersセクションはそのモジュールから下も見てくれるんだが、モジュール単位で設定しきゃならないんだろうか。(複数指定だとエラーがでた。)まあ、これはそういうものな気もするけど。

参考URL

http://kapi.jp/kapi_blog/224

2009年04月13日

関連カテゴリ Python

この記事のコメント

この記事にコメントする