我在我的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?
答案 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_name
和self.set_log()
实例。这将导致您重新打开文件的未定义结果(每次都将其截断)。
在您的计划开始时,坚持拨打basicConfig()
一次。其余代码只应关注直接logging.getLogger()
次调用。