私はPylons / TurboGearsアプリを持っています。私は同じロガーを記録したいと思います( qualname
プロパティ)を使用して、それぞれ独自のログレベルを持つ2つの異なるログハンドラを使用します。
Sentry / RavenロガーはWARN +レベルのSQLAlchemyメッセージのみを受信し、コンソールロガーはINFO +レベルのSQLAlchemyメッセージを受信する必要があります。
ここに私の短縮形のiniファイルがあります:
[loggers]
keys = root, sqlalchemy_console, sqlalchemy_sentry
[handlers]
keys = console, sentry
[formatters]
keys = generic
[logger_root]
level = INFO
handlers = console, sentry
[logger_sqlalchemy_console]
level = INFO
handlers = console
qualname = sqlalchemy.engine
propagate = 0
[logger_sqlalchemy_sentry]
level = WARN
handlers = sentry
qualname = sqlalchemy.engine
propagate = 0
しかし logger_sqlalchemy_sentry
上書きされているようです logger_sqlalchemy_console
そのメッセージを盗みます。これは、iniファイル内のロガーの順序に関係なく発生します。
Pylonsを使用して、同じレベルの複数の場所に同じロガー/名をログすることは可能ですか?
もしそうなら、Sentry / Ravenがそれらのロガーの1つになる可能性はありますか?私のiniファイルに何か問題がありますか、またはRavenにバグがありますか?
回答:
回答№1は2あなたが持っている問題は、あなたが sqlalchemy.engine
Logger
二度。ロガーセクションは、 logging.Logger
、返されるもの logging.getLogger(qualname)
。その呼び出しで返されるオブジェクトは1つだけです。同じQualnameを持つ複数のオブジェクトを複数設定することはできません。
あなたが必要とするのは複数です ハンドラー あなたがルートロガーに複数のハンドラを与えたのと同じように、そのロガーのために。その後、個々のハンドラで必要なログレベルを指定できます。
残念ながら、 fileConfig()
あなたが簡単に設定することはできません。レコードを生成したロガーに応じて異なるログレベルを持つ同じハンドラを使用する場合は、ルートとその両方のハンドラセクションを重複して設定する必要があります sqlalchemy.engine
ログレベルを異ならせるために使用します。
回答№2の場合は1
ロガーとハンドラーが混在する TokenMacGuy
あなたは2つ必要です ハンドラー ロガーの名前付き sqlalchemy.engine
。設定する StreamHandler
(コンソール)レベル付き INFO
と SentryHandler
レベルのある看守 WARNING
、 そしてその sqlalchemy.engine
レベルのロガー DEBUG
または INFO
。次に、あなたは望みの結果を得るべきです。 (ときでさえ DEBUG
メッセージがログに記録されると、ハンドラのレベルによって、レベルよりも小さいイベントが発生することはありません。)
Python 2.6以前に限定されていない限り、 logging.config.dictConfig
APIを優先して logging.config.fileConfig
、 できれば。ザ dictConfig
APIを使用すると、古いものよりもログ設定の制御が向上します fileConfig
APIは開発されません。