我想使用日志库在运行脚本的控制台和日志文件中打印日志消息。
然而,我面临两个问题:
1) setLevel功能似乎不起作用
2) 当我在控制台上打印日志消息时,两次运行之间似乎没有刷新存储运行日志消息的缓冲区。如何处置干净的StreamHandler?
为了解决第一个问题,我尝试将记录器级别更改为最低级别(logging.DEBUG),但它不起作用
为了解决第二个问题,我已经尝试了以下方法:
1) 系统。斯特杜特。声明“Stream\u log\u handler=logging.StreamHandler(sys.stdout)”之前刷新()
2) 记录器。传播=假
3)Stream_log_handler=日志记录。StreamHandler(sys.stdout)
处理程序=记录器。处理程序中处理程序的处理程序:记录器。removeHandler(处理程序)
4) 日志记录。关机()
这些都不成功。
以下是我代码的一部分:
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]中:运行文件(“…”)
2019-09-18 21:56:56,636:警告:主:乘法结果: 50
在[4]中:运行文件(“…”)
2019-09-18 21:56:56,636:警告:主:乘法结果: 50
2019-09-18 21:56:56,636:警告:主:乘法结果: 50
在[4]中:运行文件(“…”)
2019-09-18 21:56:56,636:警告:主:乘法结果: 50
2019-09-18 21:56:56,636:警告:主:乘法结果: 50
2019-09-18 21:56:56,636:警告:主:乘法结果: 50
为什么日志消息从一个运行堆叠到另一个运行?为什么只打印警告级别的消息?
您只在两个处理程序上设置了级别,而不是在记录器本身上。
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)