概要
Pythonで import tensorflow
すると、logging
のロガーの出力が消える。
この問題はTensorFlow 1.14.0以降に存在するらしい。
(筆者は1.14.0で確認)
また、TensorFlowの他にも、Google Cloud Client Library (import google.cloud
)などでも発生するらしい。
原因は、これらのライブラリが内部で利用しているabseil-pyがルートロガーのハンドラを書き換えるため。
- TensorFlowのissue: https://github.com/tensorflow/tensorflow/issues/26691
- abseil-pyのissue: https://github.com/abseil/abseil-py/issues/99
abseil-pyはGoogle内で標準的に使われているライブラリらしく、Google系のライブラリだと内部でこれを使っているっぽい。
問題の再現
tf_log.py
import logging
import tensorflow as tf
logger = logging.getLogger(__name__)
def main():
logger.info('some log')
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO)
main()
$ python tf_log.py
何も表示されない
修正
ルートロガーからabseil-pyによってセットされたハンドラを削除する。
abseil-pyはwarning以上のレベルのログをstderrに出すようにする機能も勝手にONにするらしいので、それもついでにOFFにする。
このコードは
https://github.com/tensorflow/tensorflow/issues/26691#issuecomment-500369493
より。
tf_log.py
import logging
import tensorflow as tf
try:
import absl.logging
# https://github.com/abseil/abseil-py/issues/99
logging.getLogger().removeHandler(absl.logging._absl_handler)
# https://github.com/abseil/abseil-py/issues/102
absl.logging._warn_preinit_stderr = False
except ImportError:
pass
logger = logging.getLogger(__name__)
def main():
logger.info('some log')
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO)
main()
$ python tf_log.py
INFO:__main__:some log
ログが出るようになった