Python日志记录器不打印调试消息,尽管显式处理程序



我有一个日志记录器在我的文件,其中有一个附加到它的处理程序,它的水平已被设置为调试。尽管如此,在运行我的程序时,调试语句没有打印到控制台。根记录器仍然设置为警告,但我明白,如果我向记录器添加处理程序,日志将传递给该处理程序并在传递给父记录器(最终是空记录器)之前进行记录。但事实似乎并非如此。对于上下文,下面是文件中的代码:

logger = logging.getLogger(__name__)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
logger.addHandler(console_handler)

class OpenBST:
app_data_folder = Path(user_data_dir(appname=lib_info.lib_name,
appauthor="HydrOffice"))
def __init__(self,
progress: CliProgress = CliProgress(use_logger=True),
app_data_path: Path = app_data_folder) -> None:
app_data_path.mkdir(exist_ok=True, parents=True)
self.progress = progress
self._prj = None
self._app_info = OpenBSTInfo(app_data_path=app_data_path)
self.current_project = None
logging.debug("App instance started")

下面是它在示例脚本中的调用位置:

from pathlib import Path
from hyo2.openbst.lib.openbst import OpenBST
logging.basicConfig()
logger = logging.getLogger(__name__)
project_directory = Path(os.path.expanduser("~/Documents/openbst_projects"))
project_name = "test_project"
# Create App instance
obst = OpenBST()

为什么logger.debug('App instance started')不打印到控制台?

编辑:下面的代码包括@Jesse R的建议__init__被修改如下:

class OpenBST:
app_data_folder = Path(user_data_dir(appname=lib_info.lib_name,
appauthor="HydrOffice"))
def __init__(self,
progress: CliProgress = CliProgress(use_logger=True),
app_data_path: Path = app_data_folder) -> None:
app_data_path.mkdir(exist_ok=True, parents=True)
logger = logging.getLogger(__name__)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
logger.addHandler(console_handler)
self.progress = progress
self._prj = None
self._app_info = OpenBSTInfo(app_data_path=app_data_path)
self.current_project = None
logger.debug("App instance started")

无输出(退出码0)。我的理解是附加到记录器的处理程序将在将日志传递到链之前执行(其中根仍然设置为警告)。

您调用logging.debug("App instance started"),它不是您从getLogger声明的记录器的一部分。您可以使用

logging设置通用的调试级别
logging.basicConfig(level=logging.DEBUG)

也在类之外调用logger = logging.getLogger(__name__)不能正确继承,因为您没有传递它,而是使用logging。您可以通过将该声明移动到类内部来创建一个新的日志记录器。

例如:

import logging

class SampleClass:
def __init__(self):
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.info('will log')
logging.info('will not log')
SampleClass()

运行:

$ python logtest.py 
INFO:__main__:will log

相关内容

最新更新