python
  • logging
  • 2016-08-12 27 views 1 likes 
    1

    我使用记录在我的Python脚本:为什么在python脚本中使用它写入记录器时写入null?

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

    现在还有的python脚本和每一个我必须使用记录仪的时间内很多功能我需要提及的以下行:

    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不应输入。那么,为什么有时候我在日志文件中变空了?

    +0

    ['logging.getLogger()'](https://docs.python.org/3/library/logging.html#logging.getLogger)? – Delgan

    +0

    构造函数应该更像这样:def __init __(self,variable1,varriable2,logging) –

    回答

    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_name记录器对象每次self.set_log()被调用。这会导致您重新打开文件时发生未定义的结果(每次都截断它)。

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

    +0

    @Martjin我已经添加了一个函数(编辑问题),它返回记录器对象,但是当我使用这个函数时,日志但有实际值。那么,为什么它的行为有时会在日志中增加空值? – newlearner

    +0

    @newlearner:为什么你每次都重新定义一个日志对象*?不要这样做。'logging'模块会跟踪你*的对象*。所有你需要做的就是给它一个名字,并不断询问它:'logging.getLogger(name)'。 –

    +0

    @newlearner:您的代码不断添加越来越多的'StreamHandler'实例。这肯定会导致奇怪的结果。 –

    相关问题