首页 > 编程 > Python > 正文

多个python文件调用logging模块报错误

2020-02-15 21:13:59
字体:
来源:转载
供稿:网友

python logging模块主要是python提供的通用日志系统,使用的方法其实挺简单的,这块就不多介绍。下面主要会讲到在使用python logging模块的时候,涉及到多个python文件的调用,而每个文件设置了对应的logging方式不同,可能会产生的令人困惑的现象。

下面以自己在开发的时候遇到的问题作为叙述的背景:

有三个python模块A、B、C。主模块A会import B和C模块,主模块有对应的logging方式,

A使用logging的模块的方式为:

import loggingimport logging.handlersdef CreateLogger(logFile = 'batch'):  handler = logging.handlers.RotatingFileHandler(str(logFile) + '.LOG', maxBytes = 1024 * 1024 * 500, backupCount = 5)  fmt = '%(asctime)s - %(filename)s:%(lineno)s - %(name)s - %(message)s'  formatter = logging.Formatter(fmt)  handler.setFormatter(formatter)  logger = logging.getLogger(str(logFile))  logger.addHandler(handler)  logger.setLevel(logging.INFO)  return loggersLogger = CreateLogger()

其实A模块使用logging的方式很简单,创建一个RotatingFileHandler,通过RotatingFileHandler回滚logging的方式来控制LOG文件的个数和每个LOG文件的上限大小。并创建一个Formatter对象来设置LOG文件的格式。在程序中使用这种方式产生的logging对象来打LOG,很显然使用这种方式的话,LOG都会打印到对应的LOG文件中去。

B使用logging模块的方式为

def GetLogger(testName):  logger = logging.getLogger(testName)  logger.setLevel(logging.INFO)  hdlr = logging.FileHandler(testName + '.LOG')  hdlr.setLevel(logging.INFO)  formatter = logging.Formatter("[%(asctime)s]/t[%(levelname)s]/t[%(thread)d]/t[%(pathname)s:%(lineno)d]/t%(message)s")  hdlr.setFormatter(formatter)  logger.addHandler(hdlr)  return loggerlogger = GetLogger('OK') def SetLogger(log):  global logger  logger = log

B模块默认logging的方式跟A差不多,只是B选择logging的方式是往一个LOG文件中打LOG。A其实在实际使用B模块对应的函数和类的时候并没有直接用B的logging方式,而是对B logging进行了一个重定向,这个可以从SetLogger函数的作用可以函数。A直接会把已经logging对象传给B,这样B也可以和A共享同一个logging对象,并把LOG打到A设定的文件中。这对于一个主模块调用多个子模块的逻辑、而且每个子模块都有对应的logging使用方式、打到不同文件中进行统一还是挺有好处的,这样可以有效的控制总的LOG文件大小和数量。

但是没有注意C模块,然后发现的情况是,A程序在运行过程中会把A、B模块的LOG信息直接打到屏幕上,而且LOG文件中也有对应的LOG。这些挺让人困惑的,把对B模块的调用注释掉,依然会发现有A的LOG直接打到屏幕上。但是把A程序中设置logging对象的那段代码单独拿出来,一切都正常。

根据当时的情景,只能怀疑是C模块中有什么设置,会导致A、B模块打LOG的方式有些转变。后来意识到,C模块中并没有设置logging的对象,而是直接使用logging.info去打LOG。把这部分的逻辑注释掉,发现A、B打LOG的方式又恢复正常,再也不会往屏幕上打LOG。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表