python - 将日志级别设置为 logging.DEBUG 或 logging.INFO 无效

标签 python logging python-3.6

我正在尝试做一个非常简单的日志记录设置。我只希望我所有的日志输出都转到终端和我的日志文件。我在 Real Python 上找到了以下示例演示了流和文件日志处理程序的设置:

# logging_example.py

import logging

# Create a custom logger
logger = logging.getLogger(__name__)

# Create handlers
c_handler = logging.StreamHandler()
f_handler = logging.FileHandler('file.log')
c_handler.setLevel(logging.WARNING)
f_handler.setLevel(logging.ERROR)

# Create formatters and add it to handlers
c_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
f_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
c_handler.setFormatter(c_format)
f_handler.setFormatter(f_format)

# Add handlers to the logger
logger.addHandler(c_handler)
logger.addHandler(f_handler)

logger.warning('This is a warning')
logger.error('This is an error')

## Log Output
# 2019-08-31 22:16:02,478 - __main__ - WARNING - This is a warning
# 2019-08-31 22:16:02,478 - __main__ - ERROR - This is an error

这会如您所料地记录到控制台和文件中。但是,当我修改程序使其也记录 INFO 时,如下所示:

import logging

# Create a custom logger
logger = logging.getLogger(__name__)

# Create handlers
c_handler = logging.StreamHandler()
f_handler = logging.FileHandler('file.log')
c_handler.setLevel(logging.DEBUG)
f_handler.setLevel(logging.DEBUG)

# Create formatters and add it to handlers
c_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
f_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
c_handler.setFormatter(c_format)
f_handler.setFormatter(f_format)

# Add handlers to the logger
logger.addHandler(c_handler)
logger.addHandler(f_handler)


logger.warning('logs')
logger.error('logs')
logger.info('should log but doesn\'t')
logger.debug('should log but doesn\'t')

## Log Output
# __main__ - WARNING - logs
# __main__ - ERROR - logs

我做错了什么?任何帮助将不胜感激!

最佳答案

您还需要在 logger 对象本身上调用 setLevel(level),因为默认情况下,它将使用 ROOT' s 日志记录级别(如果它没有任何其他祖先),即 WARNING:

logger.setLevel(logging.DEBUG)

带输出的完整代码:

import logging

logger = logging.getLogger(__name__)

# Create handlers
c_handler = logging.StreamHandler()
f_handler = logging.FileHandler('file.log')
logger.setLevel(logging.DEBUG) # <<< Added Line
c_handler.setLevel(logging.DEBUG)
f_handler.setLevel(logging.INFO)

# Create formatters and add it to handlers
c_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
f_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
c_handler.setFormatter(c_format)
f_handler.setFormatter(f_format)

# Add handlers to the logger
logger.addHandler(c_handler)
logger.addHandler(f_handler)


logger.warning('logs')
logger.error('logs')
logger.info('should log but doesn\'t')
logger.debug('should log but doesn\'t')

输出:

__main__ - WARNING - logs
__main__ - ERROR - logs
__main__ - INFO - should log but doesn't
__main__ - DEBUG - should log but doesn't

关于python - 将日志级别设置为 logging.DEBUG 或 logging.INFO 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57742985/

相关文章:

python - 对两个数组进行排序以查看它们是否具有相同的值,但它只会发现数组中有 2/3 的值相同

python - 将开始日期和结束日期的数据框透视到真值表中

tensorflow - 属性错误 : module 'tensorflow' has no attribute 'Session'

python - 检查是否有任何字符串列表在另一个字符串中

python - 截断 SciPy 随机分布

python - django打印元组键控字典

linux - 如何将多个正在运行的 ping 线程反馈/结果保存到每个相关文件输出?

java - 用 Java 写入文件 : Cannot find the path specified

python - 我如何为每个线程创建自己的日志记录实例?

python - 列表元素索引的输出不正确 - Python