python - 为什么这个自定义记录器不将信息记录到控制台和文件?
问题描述
我在 my_logging.py 中定义了一个记录器函数:
def my_logger(name):
print("warn:", name)
logger = logging.getLogger(name)
# Create handlers
c_handler = logging.StreamHandler()
f_handler = logging.FileHandler('logs/demo.log')
c_handler.setLevel(logging.INFO)
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)
return logger
然后我在 test.py 中使用它:
import my_logging
logger = my_logging.my_logger(__name__)
logger.info("This is a test!")
它根本不记录!我之所以要将记录器放入一个函数中,是因为我希望它在多个模块中使用,使用相同的日志记录配置。
这里有什么问题?我测试过,似乎它与处理程序的 setLevel() 方法有关。logging.INFO 没有效果。
解决方案
在setLevel()的文档中,您可以看到根记录器使用WARRING
级别,并且可能会阻止INFO
处理程序中的级别。
您必须INFO
为根记录器设置级别
logger = logging.getLogger(name)
logger.setLevel(logging.INFO)
如果您还需要DEBUG
消息,那么您必须DEBUG
为根记录器和处理程序设置级别。
logger.setLevel(logging.DEBUG)
c_handler.setLevel(logging.DEBUG)
f_handler.setLevel(logging.DEBUG)
使用不同级别的处理程序,您可以仅在屏幕上或仅向文件发送调试消息。
推荐阅读
- c# - 在 Visual Studio 中打开统一代码片段
- angular - Typescript 打印 PDF 文件在另存为 PDF 时不显示文件名
- c# - Ado.Net DBase 驱动程序使用制表符截断单元格
- ios - 当 UIAlert 出现时如何显示键盘 带有自定义 UITextLabel 视图的 UIAlert
- python - 我从 github 运行 python 代码进行加密。很多错误阻止我正确执行它
- java - 将数组拆分为两个相等的子数组,其中选择了索引
- php - 在 while 循环内插入 tempTable 和 Select From tempTable 查询
- hibernate - 休眠搜索不返回新创建实体的结果
- json - 在 SQL Server 中输出嵌套 json 的最简单方法是什么?
- tensorflow - 即使安装了 tensorflow GPU,Keras 深度学习也无法在 GPU 上运行