【问题标题】:Why is logging not considering my configurations?为什么日志记录不考虑我的配置?
【发布时间】:2019-09-18 20:20:17
【问题描述】:

我想使用日志库在运行脚本的控制台和日志文件中打印日志消息。

但是,我面临两个问题:

1) setLevel 函数似乎不起作用

2) 当我在控制台上打印日志消息时,似乎存储运行日志消息的缓冲区在两次运行之间没有刷新。我应该如何处理干净的 StreamHandler?

为了解决第一个问题,我尝试将记录器级别更改为最低(logging.DEBUG),但不起作用

为了解决第二个问题,我已经尝试了以下方法:

1) sys.stdout.flush() 在声明“Stream_log_handler = logging.StreamHandler(sys.stdout)”之前

2) logger.propagate = False

3) Stream_log_handler = logging.StreamHandler(sys.stdout)

handlers = logger.handlers 对于处理程序中的处理程序: logger.removeHandler(处理程序)

4) logging.shutdown()

这些都不成功。

这是我的代码的一部分:

import logging
import sys

logger = logging.getLogger(__name__)
formatter = logging.Formatter('%(asctime)s:%(levelname)s:%(name)s:%(message)s')
level = 'DEBUG'

file_log_handler = logging.FileHandler('logging_test.log')
file_log_handler.setLevel(logging.DEBUG)
file_log_handler.setFormatter(formatter)
logger.addHandler(file_log_handler)

stream_log_handler = logging.StreamHandler(sys.stdout)
stream_log_handler.setLevel(logging.DEBUG)
stream_log_handler.setFormatter(formatter)
logger.addHandler(stream_log_handler)

def add(x,y):
    """Add function"""
    result = x+y
    logger.info('Add result : {}'.format(result))
    return result

def substract(x,y):
    """Substract function"""
    result = x-y
    logger.debug('Substract result : {}'.format(result))
    return result

def multiply(x,y):
    """Multiply function"""
    result = x*y
    logger.warning('Multiply result : {}'.format(result))
    return result

def divide(x,y):
    """Divide function"""
    try:
        result = x-y
        logger.debug('Divide result : {}'.format(result))
    except ZeroDivisionError:
        logger.error('Tried to divide by zero')
    else:
        return result


num_1 = 10
num_2 = 5

add_result = add(num_1, num_2)

sub_result = substract(num_1, num_2)

mul_result = multiply(num_1, num_2)

div_result = divide(num_1, num_2)

在控制台中,我得到:

  • 第一次运行:

在[3]中:runfile('...')

2019-09-18 21:56:56,636:WARNING:ma​​in:相乘结果:50

  • 第二次运行:

在[4]中:runfile('...')

2019-09-18 21:56:56,636:WARNING:ma​​in:相乘结果:50

2019-09-18 21:56:56,636:WARNING:ma​​in:相乘结果:50

  • 第三次运行:

在[4]中:runfile('...')

2019-09-18 21:56:56,636:WARNING:ma​​in:相乘结果:50

2019-09-18 21:56:56,636:WARNING:ma​​in:相乘结果:50

2019-09-18 21:56:56,636:WARNING:ma​​in:相乘结果:50

为什么日志消息从一个运行堆到另一个运行? 为什么只打印警告级别的消息?

【问题讨论】:

    标签: python logging


    【解决方案1】:

    您只在两个处理程序上设置了级别,而不是在记录器本身上。

    logger = logging.getLogger(__name__)
    formatter = logging.Formatter('%(asctime)s:%(levelname)s:%(name)s:%(message)s')
    
    file_log_handler = logging.FileHandler('logging_test.log')
    file_log_handler.setLevel(logging.DEBUG)
    file_log_handler.setFormatter(formatter)
    logger.addHandler(file_log_handler)
    
    stream_log_handler = logging.StreamHandler(sys.stdout)
    stream_log_handler.setLevel(logging.DEBUG)
    stream_log_handler.setFormatter(formatter)
    logger.addHandler(stream_log_handler)
    
    logger.setLevel(logging.DEBUG)
    

    【讨论】:

    • 您好 Chepner,感谢您的回答。事实上,添加“logger.setLevel(logging.DEBUG)”有助于打印出日志消息。但是,如果它不起作用,为什么还有一个 logging.XHandler.setLevel() 方法呢?如果我最终必须通过使用 logger.setLevel(logging.Y) 为记录器模块设置新配置来擦除每个配置,我该如何区分处理程序配置?最后,第二个问题,控制台上的叠加打印没有解决......
    • 在处理程序决定是否也会“做出反应”之前,消息必须通过记录器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 2018-07-28
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多