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

时间:2016-08-12 09:45:23

标签: python logging

我在我的python脚本中使用logger:

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

现在python脚本中有很多函数,每次我必须使用logger时我需要提到以下行:

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

一次又一次。为了解决这个我声明的函数,它返回logger对象,如下所示:

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。那么,为什么我有时会在日志文件中获取null?

1 个答案:

答案 0 :(得分:1)

您不需要每次都致电logging.basicConfig(),不。您只需要将其称为一次logging.basicConfig()函数始终返回None,因此您无法使用它来访问Logger.info()方法。

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

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

logger = logging.getLogger(__name__)

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

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

无论如何,顶级logging.info()函数只是委托给根记录器,它等同于logging.getLogger().info()。如果在之前没有调用它,它会调用logging.basicConfig()

每次调用FileHandler()时,您更新的示例函数都会向单例StreamHandler()记录器对象添加新的logger_nameself.set_log()实例。这将导致您重新打开文件的未定义结果(每次都将其截断)。

在您的计划开始时,坚持拨打basicConfig() 一次。其余代码只应关注直接logging.getLogger()次调用。