使用dictConfig进行日志记录并写入控制台和文件

时间:2017-07-27 03:50:08

标签: python file logging stream

在我的代码中,我有以下内容用于详细模式和非详细模式。我是从logDict对象中读取的。

我希望在详细模式下,我会将"DEBUG MODE: test debug""DEBUG MODE: test error"写入控制台,"[uuid] [date] [etc] test error"只写入文件,而非详细模式则不会打印任何内容到控制台但"test error"将被写入文件。

首先,这是我的dictConfig

LOGGING_DICT = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
    'simple': {
        # we have a uuid for the log so we know what process it came from
        'format': '[{0}][%(asctime)s][%(name)s][%(levelname)s] : %(message)s'.format(logger_id),
        'datefmt': "%Y-%m-%d %H:%M:%S",
        }
},
'loggers': {
    'root': {
        'handlers': ['console'],
        'level': 'DEBUG',
    },
    'script_A': {
        'handlers': ['timed_rotate_file'],
        'level': 'INFO',
    },
},
'handlers' : {
    'timed_rotate_file': {
        'filename': 'logs/weekly_tool.log',
        'level': 'INFO',
        'formatter': 'simple',
        'class': 'logging.handlers.TimedRotatingFileHandler',
        'encoding': 'utf8',
        # Used to configure when backups happen 'seconds, minutes, w0,w1 (monday tuesday)
        'when': 'midnight',  # Daily backup
        # This is used to configure rollover (7=weekly files if when = daily or midnight)
        'backupCount': 7,
    }
}

现在是调用它的脚本

from logging.config import dictConfig
from helpers.logging_config import LOGGING_DICT

...
main():
    logger.debug("test debug")
    logger.error("test error")

if __name__ == "__main__":
    if args.verbose:
        dictConfig(LOGGING_DICT)
        logger = logging.getLogger("script_A")
        stream_handler = logging.StreamHandler()
        formatter = logging.Formatter("DEBUG MODE: %(message)s")
        stream_handler.setFormatter(formatter)
        stream_handler.setLevel(logging.DEBUG)
        logger.addHandler(stream_handler)
    else:
        dictConfig(LOGGING_DICT)
        logger = logging.getLogger("script_A")

我得到的是以下内容:

~$ python script_A.py
~$ (No output, as expected)
~$ python script_A.py -v
~$ DEBUG MODE: test error 

为什么test_debug不能打印到控制台?显然,正在调用流处理程序,但是级别未正确设置或被忽略。

当我在脚本中间打印logger.level时,我得到20,这是我对dictConfig的期望,但处理程序的级别是单独设置的,这是否意味着它被忽略了? (What is the point of setLevel in a python logging handler?)< - 我也在看这个,但我的问题被翻转了。在dict配置中,我的设置比我实际想要打印的设置更严格,这意味着如果我重置记录器的日志级别,我将从dictConfig获取,我不想打印到我的文件的是打印。我可以绕过这个吗?

1 个答案:

答案 0 :(得分:1)

我自己想出来了。与我发布的内容类似,我必须重置日志级别。

if __name__ == "__main__":
    if args.verbose:
        dictConfig(LOGGING_DICT)
        logger = logging.getLogger("script_A")
        stream_handler = logging.StreamHandler()
        formatter = logging.Formatter("DEBUG MODE: %(message)s")
        stream_handler.setFormatter(formatter)
        stream_handler.setLevel(logging.DEBUG)
        logger.addHandler(stream_handler)
        logger.setLevel(logging.DEBUG)
    else:
        dictConfig(LOGGING_DICT)
        logger = logging.getLogger("script_A")

我认为这样做意味着文件处理程序级别也会发生变化,但出于某些原因并没有发生。如果有人知道为什么我想知道内部是如何工作的。