gpt4 book ai didi

python - 为什么在 python 脚本中使用记录器时会在记录器中写入 null ?

转载 作者:太空宇宙 更新时间:2023-11-03 16:16:27 25 4
gpt4 key购买 nike

我在 python 脚本中使用记录器:

import logger
logging.basicConfig(filename='sample.log',level=logging.DEBUG)
logging.info("helllo")

现在 python 脚本中有很多函数,每次我必须使用记录器时,我都需要提及以下行:

logging.basicConfig(filename='sample.log',level=logging.DEBUG)

一次又一次。为了解决这个问题,我声明了返回记录器对象的函数,如下所示:

class sample()
def set_log(self):
l = logging.getLogger(logger_name)
l.setLevel(logging.DEBUG)
formatter = logging.Formatter(' %(levelname)s : %(message)s')
fileHandler = logging.FileHandler("c:/sample.log", mode='w')
fileHandler.setFormatter(formatter)
streamHandler = logging.StreamHandler()
streamHandler.setFormatter(formatter)
l.addHandler(fileHandler)
return l
def func(self):
log = self.set_log()
log.info("hsdhkhd")

现在我在 func() 中使用 set_log() 但发生的情况是有时它会在日志中的各个位置插入 NUll 但实际上不应输入 null 。那么,为什么我有时会在日志文件中得到空值?

最佳答案

您不需要调用logging.basicConfig()每次,不。您只需调用它一次logging.basicConfig()函数始终返回 None ,因此您不能使用它来访问 Logger.info()无论如何,方法。

您始终可以使用 logging.getLogger() 访问根记录器(处于配置状态) 。那是因为logging模块使用单例(全局状态)来配置所有日志操作。

约定是在模块中存储对记录器的全局引用:

logger = logging.getLogger(__name__)

这里的模块名称用于指示日志消息的来源,这也允许您调整每个模块的配置。

但是,随后调用 logging.getLogger(somename)将始终返回相同的单例记录器对象(不传入名称会为您提供层次结构中的根 Logger)。

无论如何,顶级logging.info()函数只是委托(delegate)给根记录器,它相当于 logging.getLogger().info() 。它确实调用 logging.basicConfig() 如果之前没有调用过

<小时/>

您更新的示例函数将添加新的 FileHandler()StreamHandler()单例实例logger_name每次记录器对象 self.set_log()叫做。这将导致您重新打开文件(每次都会截断它)出现未定义的结果。

坚持调用basicConfig() 一次,在程序开始时。其余代码应该只关心直接 logging.getLogger()来电。

关于python - 为什么在 python 脚本中使用记录器时会在记录器中写入 null ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38914874/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com