【问题标题】:python.logging: Why does my non-basicConfig setting not work?python.logging:为什么我的 non-basicConfig 设置不起作用?
【发布时间】:2018-12-10 01:40:29
【问题描述】:

我想从主模块和所有子模块记录到单个日志文件。

从我定义记录器的主文件发送的日志消息按预期工作。但是从调用发送到导入函数的那些丢失了。

如果我像下面的示例 1 那样使用 logging.basicConfig,它就可以工作。 但是允许更多自定义设置的第二个示例不起作用。

有什么想法吗?

# in the submodule I have this code
import logging
logger = logging.getLogger(__name__)

示例 1 - 工作

在这里我创建了两个处理程序并将它们传递给basicConfig

# definition of root looger in main module

formatter = logging.Formatter(fmt="%(asctime)s %(name)s.%(levelname)s: %(message)s", datefmt="%Y.%m.%d %H:%M:%S")   

handler = logging.FileHandler('logger.log')
handler.setFormatter(formatter)
handler.setLevel(logging.DEBUG)

handler2 = logging.StreamHandler(stream=None)
handler2.setFormatter(formatter)
handler2.setLevel(logging.DEBUG)

logging.basicConfig(handlers=[handler, handler2], level=logging.DEBUG)
logger = logging.getLogger(__name__)

示例 2 - 不工作

在这里我创建了两个处理程序并将它们addHandler() 发送到根记录器:

# definition of root looger in main module

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

handler = logging.FileHandler('logger.log')
handler.setFormatter(formatter)
handler.setLevel(logging.DEBUG)
#handler.setLevel(logging.ERROR)
logger.addHandler(handler)

handler = logging.StreamHandler(stream=None)
handler.setFormatter(formatter)
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)

【问题讨论】:

  • 示例 2 确实 对我有用(如果我从第一行复制您的 formatter = logging.Formatter(...) 行)。这个项目还有其他可能会影响事情的地方吗?
  • 你真的可以在日志文件和控制台中看到module1.DEBUG: test吗?我不确定还有什么可能导致问题。我将这个从我的项目归结为一个仍然显示行为的最小工作示例。我的第一个想法是我在 logging 的单例事情上做错了。
  • 你在调用什么来生成日志条目? logging.warn()logger.warn(),您应该使用 logger(其中 warn() 只是任何日志记录方法(信息、调试等)的占位符。
  • 是的,我正在使用logger.debug('test')。刚测试logging.debug('test'),也没有出现。
  • 你能显示你的根记录器配置吗?

标签: python python-3.x logging


【解决方案1】:

您需要在软件的主模块中配置(一个且唯一的)根记录器。这是通过调用

logger = logging.getLogger() #without arguments

而不是

logger = logging.getLogger(__name__)

(Python doc on logging)

第二个示例使用您的脚本名称创建一个单独的子记录器。

如果子模块中没有定义处理程序,则将日志消息传递给根记录器进行处理。

可以在此处找到相关问题: Python Logging - How to inherit root logger level & handler

【讨论】:

  • 是的,我看到了2018.07.01 22:02:04 __main__.DEBUG: got here (Python 3.4)
  • 好的很好(它也应该出现在 .log 文件中)。所以现在你必须弄清楚你在代码中做了哪些不同的事情——因为你知道这是可行的。
  • 问题不在于我从主模块发送的消息。他们总是在那里。但是我没有从我导入的模块中得到那些。您能否创建一个具有某些功能的模块,如果您从主模块调用该功能,看看是否可以记录消息?
  • 知道了。在您的第一个示例中,您正在配置根记录器,在第二个示例中,您正在使用脚本名称创建一个单独的子记录器。如果要直接配置根记录器,请使用logger = logging.getLogger() 而不是logger = logging.getLogger(__name__)
  • 当然。你的提示,你的代表:)
猜你喜欢
  • 2015-01-11
  • 2015-05-02
  • 2017-12-25
  • 2023-03-14
  • 2016-09-25
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 2015-05-25
相关资源
最近更新 更多