python-3.x - 记录 getLogger 不输出
问题描述
我正在尝试为 python 模块设置日志记录机制。
以下是我为设置日志记录而编写的示例代码
import logging
def init_logger(logger):
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(message)s')
ch = logging.StreamHandler()
ch.setFormatter(formatter)
ch.setLevel(logging.INFO)
logger.addHandler(ch)
file_handler = logging.FileHandler('test_logging.log')
file_handler.setFormatter(formatter)
file_handler.setLevel(logging.DEBUG)
logger.addHandler(file_handler)
def foo1():
logger = logging.getLogger(__name__)
logger.info('Test Info')
logger.debug('Test Debug')
logger.error('Test Error')
def foo2():
logger = logging.getLogger(__name__)
logger.info('Test Info')
logger.debug('Test Debug')
logger.error('Test Error')
if __name__ == '__main__':
logger = logging.getLogger(__name__)
init_logger(logger)
foo1()
foo2()
我希望日志将信息级别及以上打印到标准输出和调试级别及以上以写入日志文件。但我看到的是只有错误级别输出到标准输出和日志文件。
2019-08-13 11:20:07,775 - ERROR - test_logger.py - foo1 - Test Error
2019-08-13 11:20:07,776 - ERROR - test_logger.py - foo2 - Test Error
根据文档 getLogger
应该返回相同的记录器实例。我什至第一次尝试创建一个新实例,logger = logging.Logger(__name__)
但没有运气。我不明白我在这里错过了什么。
解决方案
简短回答:您必须在代码中使用logging.basicConfig(level=...)
or logger.setLevel
。
当您logging.getLogger('some_name')
第一次使用时,您使用level = NOTSET = 0
.
# logging module source code
class Logger(Filterer):
def __init__(self, name, level=NOTSET):
...
logging.NOTSET
似乎是一个有效的水平值,但它不是。实际上,它是非法值,表示未启用记录器来记录任何内容并强制记录器使用父记录器(根记录器)的级别。此逻辑在Looger.getEffectiveLevel
方法中定义:
# logging module source code
def getEffectiveLevel(self):
logger = self
while logger:
if logger.level: # 0 gives False here
return logger.level
logger = logger.parent # 0 makes this line reachable
return NOTSET
根记录器有level=WARNING
新创建的记录器继承这个级别:
# logging module source code
root = RootLogger(WARNING)
logging.getLogger
不允许您指定日志记录级别。因此,您必须使用logging.basicConfig
修改根记录器或logger.setLevel
在脚本开头的某处修改新创建的记录器。
我想该功能应该记录在日志模块指南/文档中。
推荐阅读
- python - 从 Wikipedia 上的 BeautifulSoup webscrape 中查找 TICKR 编号
- python - python请求中缺少身份验证参数(401)
- vue.js - 如何将 axios 的响应传递给 axios 外部的变量
- android - 为什么我的盒子阴影没有在 Android 上显示?
- javascript - 类中的回调问题(未检测到在方法关闭时调用函数)
- python-3.x - Pycharm CE:无法启动进程:工作目录不存在
- tensorflow.js - 克隆 Tensorflow.js 加载模型
- swift - 如何使用 Swift 初始化不区分大小写的字典?
- java - Git:如何在不丢失当前分支的情况下克隆项目?
- ruby-on-rails - 什么会导致来自 Ceph 的 400 Bad Request 不会影响 GET URL?