11
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Google系ライブラリ(TensorFlowやGoogle Cloudなど)のabseil-pyによるlogging汚染を回避する

Last updated at Posted at 2019-07-13

概要

Pythonで import tensorflow すると、loggingのロガーの出力が消える。
この問題はTensorFlow 1.14.0以降に存在するらしい。
(筆者は1.14.0で確認)

また、TensorFlowの他にも、Google Cloud Client Library (import google.cloud)などでも発生するらしい。

原因は、これらのライブラリが内部で利用しているabseil-pyがルートロガーのハンドラを書き換えるため。

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

ログが出るようになった

11
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?