/ / python、logging、pylons、sentry、raven同じ名前の2つのPylonsロガーハンドラー(Sentry / Ravenとコンソール)

python、logging、pylons、sentry、ravenの2つのPylonsロガーハンドラー(Sentry / Ravenとコンソール)。

私は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 (コンソール)レベル付き INFOSentryHandler レベルのある看守 WARNING、 そしてその sqlalchemy.engine レベルのロガー DEBUG または INFO。次に、あなたは望みの結果を得るべきです。 (ときでさえ DEBUG メッセージがログに記録されると、ハンドラのレベルによって、レベルよりも小さいイベントが発生することはありません。)

Python 2.6以前に限定されていない限り、 logging.config.dictConfig APIを優先して logging.config.fileConfig、 できれば。ザ dictConfig APIを使用すると、古いものよりもログ設定の制御が向上します fileConfig APIは開発されません。