Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Tensorflow suppresses logging messages bug

Tensorflow makes logging messages hide and not appear when I run the code.

I have tried the following stuff but couldn't find a way to make my code work.

import logging
logger = tf.get_logger()
logger.setLevel(logging.ERROR)


import os
import tensorflow as tf

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'

So my code is the following

import logging
import tensorflow as tf

logging.basicConfig(filename='example.log', level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')

I expected to have the debug messages into my file example.log but nothing appeared inside example log. When I import tensorflow, the messages don't appear and when I don't they do.

I need to use both tensorflow and logging because I use an existing code. Is there a way so logging suppresses Tensorflow?

like image 861
Dimitris Triantafillidis Avatar asked Jul 11 '19 08:07

Dimitris Triantafillidis


2 Answers

Two facts:

  1. logging.basicConfig will do nothing if the root logger is already configured:

    This function does nothing if the root logger already has handlers configured for it.

  2. tensorflow has the absl-py dependency that will try to initialize logging when imported by appending a NullHandler to the root handler:

    # The absl handler will always be attached to root, not the absl logger.
    if not logging.root.handlers:
      # Attach the absl handler at import time when there are no other handlers.
      # Otherwise it means users have explicitly configured logging, and the absl
      # handler will only be attached later in app.run(). For App Engine apps,
      # the absl handler is not used.
      logging.root.addHandler(_absl_handler)
    

    Not sure why the handler is attached to the root logger instead of the absl logger, though - might be a bug or a workaround for some other issue.

So the problem is that the import tensorflow call will call import absl.logging which causes an early logger configuration. The subsequent call (yours) to logging.basicConfig will hence do nothing. To fix that, you need to configure logging before importing tensorflow:

import logging
logging.basicConfig(filename='example.log', level=logging.DEBUG)
import tensorflow as tf

logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')

Rule of thumb: always call your logging configuration as early as possible.

Writing logs in default format to file

If you just want to write the default logs to file, abseil logger can also do that:

from absl import logging as absl_logging

absl_logging.get_absl_handler().use_absl_log_file(
    program_name='mytool',
    log_dir='/var/logs/'
)
like image 83
hoefling Avatar answered Nov 16 '22 08:11

hoefling


Besides the method offered by @hoefling, you can also clear the handlers of the root logger just before your logging configurations:

logging.getLogger().handlers = []
# ...
logging.basicConfig(level=level, handlers=handlers)
like image 45
Shi XiuFeng Avatar answered Nov 16 '22 08:11

Shi XiuFeng