[解決済み] Python Logging でログメッセージが2回表示される件
質問
Pythonのロギングを使っているのですが、なぜかすべてのメッセージが2回表示されます。
ロギングを設定するモジュールがあるのですが。
# BUG: It's outputting logging messages twice - not sure why - it's not the propagate setting.
def configure_logging(self, logging_file):
self.logger = logging.getLogger("my_logger")
self.logger.setLevel(logging.DEBUG)
self.logger.propagate = 0
# Format for our loglines
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
# Setup console logging
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)
self.logger.addHandler(ch)
# Setup file logging as well
fh = logging.FileHandler(LOG_FILENAME)
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
self.logger.addHandler(fh)
後ほど、このメソッドを呼び出してログの設定をしています。
if __name__ == '__main__':
tom = Boy()
tom.configure_logging(LOG_FILENAME)
tom.buy_ham()
そして、buy_hamモジュールと言う中で、私は電話をかけます。
self.logger.info('Successfully able to write to %s' % path)
そしてなぜか、すべてのメッセージが2回表示されます。ストリームハンドラの1つをコメントアウトしても、まだ同じことが起こっています。少し奇妙なもので、なぜこれが起こっているのか分かりません(笑)。私が何か明らかなことを見逃していると仮定すると。
乾杯。 Victor
どのように解決するのですか?
あなたは
configure_logging
を二度呼び出しています(たぶん
__init__
のメソッドで
Boy
) :
getLogger
は同じオブジェクトを返しますが
addHandler
は同様のハンドラがすでにロガーに追加されているかどうかを チェックしません。
そのメソッドへの呼び出しをトレースして、これらのうちの一つを排除してみてください。あるいは、フラグを設定する
logging_initialized
に初期化されている
False
の中で
__init__
メソッドの
Boy
を変更し
configure_logging
を何もしないように変更します。
logging_initialized
は
True
に設定し、それを
True
に設定します。
もしプログラムが複数の
Boy
インスタンスを作成する場合、グローバルな
configure_logging
関数がハンドラを追加し
Boy.configure_logging
メソッドはハンドラを初期化するだけで
self.logger
属性を初期化するだけです。
これを解決するもう一つの方法は、ロガーの handlers 属性を確認することです。
logger = logging.getLogger('my_logger')
if not logger.handlers:
# create the handlers and call logger.addHandler(logging_handler)
関連
-
[解決済み】Pythonのロガーがログファイルに加えて標準出力にも全メッセージを出力するようにする。
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] virtualenvで異なるバージョンのPythonを使用する
-
[解決済み】Pythonのエラーをデバッグ情報とともにログに記録する方法は?
-
[解決済み] pandasのDataFrameから空のセルを含む行を削除する
-
[解決済み] テンプレートファイル変更時にFlaskアプリを再読み込みする
-
[解決済み] asyncio.ensure_future vs. BaseEventLoop.create_task vs. simple coroutine?
-
[解決済み] 乱数の行列を作成する簡単な方法
-
[解決済み] Python 2 で HEAD HTTP リクエストを送信するには?
-
[解決済み] sqlalchemy の declarative ORM 拡張機能で複数カラムのインデックスを使用する場合
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] pandasのDataFrameから空のセルを含む行を削除する
-
[解決済み] googletransがエラー 'NoneType' オブジェクトに 'group' 属性がない、と言って動かなくなった。
-
[解決済み] Matplotlibのレジェンドが動作しない
-
[解決済み] IPythonの終了確認を無効にする
-
[解決済み] 集合からランダムな選択? python
-
[解決済み] TypeError: can't multiply sequence by non-int of type 'float'」と表示されるのはなぜですか?
-
[解決済み] Pythonで関数の引数として辞書の項目を渡すには?重複
-
[解決済み] 2つの日付の間の月数を求める最良の方法
-
[解決済み] Pandasがラベルで選択すると、Seriesを返す場合とDataFrameを返す場合があります。
-
[解決済み] PythonによるCURLの代替