23

それで、昨日公開された Google のTensorflowライブラリをいじっていたところ、私を悩ませ続ける厄介なバグに遭遇しました。

私が行ったことは、通常どおり Python ロギング関数をセットアップすることでした。その結果、tensorflow ライブラリをインポートすると、コンソール内のすべてのメッセージが 2 倍になり始めました。興味深いことに、関数を使用するだけでは、これは発生しませんlogging.warn/info/..()

メッセージを 2 倍にしないコードの例:

import tensorflow as tf
import logging

logging.warn('test')

すべてのメッセージを 2 倍するコードの例:

import tensorflow as tf
import logging

logger = logging.getLogger('TEST')
ch = logging.StreamHandler()
logger.addHandler(ch)

logger.warn('test')

今、私は単純な男です。の機能が気に入ってlogging使っています。loggerオブジェクトと a の追加のセットアップは、StreamHandler他の人がこれをどのように行ったかを見て拾ったものですが、それはそれが意図された使用方法に適合しているように見えます. ただし、ログ ライブラリは常に機能しているだけなので、ログ ライブラリについての詳細な知識はありません。

そのため、メッセージが 2 倍になる理由を説明するヘルプが最も役立ちます。

Python 2.7.6 で Ubuntu 14.04.3 LTS を使用していますが、試したすべての Python 2.7 バージョンでエラーが発生します。

4

2 に答える 2

26

私はこの出力を得ます:

test
WARNING:TEST:test

Tensorflowロギング フレームワークを使用しており、独自のハンドラーを設定しているため、デフォルトでは、ログに記録すると、tensorflow 内の親ロギング ハンドラーまで伝播されます。この動作は、次のように設定して変更できます。

logger.propagate = False

単純な python ロギング構成での重複出力も参照してください

フォローアップ: これは、tensorflow が logging パッケージを使用していた方法の意図しない副作用でした。この汚染を避けるために、「tensorflow」という名前で内部ロガーをスコープするように HEAD で変更しました。1 日かそこら以内に github の頭にあるはずです。それまでの間、logger.propagate ソリューションは機能し、その修正が行われると壊れることはないので、安全に使用できるはずです。これを見つけてくれてありがとう!

フォローアップ - フォローアップ: TensorFlow 1.14から開始すると、以下がlogger直接公開されます。

import tensorflow as tf

logger = tf.get_logger()
于 2015-11-12T04:45:29.343 に答える