【问题标题】:Python logger not printing debug messages, despite explicit handlerPython 记录器不打印调试消息,尽管有明确的处理程序
【发布时间】:2021-08-05 18:49:54
【问题描述】:

我的文件中有一个记录器,它附加了一个处理程序,并且它的级别已设置为调试。尽管如此,在运行我的程序时,调试语句不会打印到控制台。根记录器仍设置为警告,但我知道如果我向记录器添加处理程序,则日志将传递给该处理程序并在传递给父记录器(最终为空记录器)之前记录。情况似乎并非如此。对于上下文,这里是文件中的代码:

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)。 我的理解是附加到记录器的处理程序将在将日志传递到链上之前执行(其中根仍设置为警告)。

【问题讨论】:

  • 当您致电 debug 时,logginglogger 可能是代码中的拼写错误?
  • 这绝对是一个错字。并立即修复,谢谢。但问题还是一样,很可能是继承问题,如下所述。

标签: python python-3.x logging


【解决方案1】:

您调用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

【讨论】:

  • 你在第一部分是对的,我有一个错字。但是,在第二部分中,在类中添加记录器似乎与文档中提到的模块级记录器最佳实践相反。尽管如此,将记录器切换到示例类中,我没有看到调试日志被打印出来。我认为让我感到困惑的是,尽管已将处理程序附加到记录器,但它仍然没有打印出来。根据码头的流程图,应该。
  • 我可以看到__init__中代码的更新版本吗?
  • 我已将代码作为编辑附加到原始问题@Jesse R
  • 使用logger.setLevel(logging.DEBUG)而不是流处理程序在记录器本身上调用setLevel
猜你喜欢
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多