【问题】
有一个比较长的python脚本文件,其中关于log日志输出,用的是logging,对应初始化代码为:
logging.basicConfig( level = logging.DEBUG, format = 'LINE %(lineno)-4d %(levelname)-8s %(message)s', datefmt = '%m-%d %H:%M', filename = scriptSelfName + ".log", filemode = 'w'); # define a Handler which writes INFO messages or higher to the sys.stderr console = logging.StreamHandler(); console.setLevel(logging.INFO); # set a format which is simpler for console use formatter = logging.Formatter('LINE %(lineno)-4d : %(levelname)-8s %(message)s'); # tell the handler to use this format console.setFormatter(formatter); logging.getLogger('').addHandler(console);
然后logging.info,logging.debug等就可以输入日志到对应的log文件BlogToWordpress.log中了。
现在该文件由于太大,被分为一个主文件BlogToWordpress.py和多个子文件,比如BlogNetease.py,crifanLib.py等。
由于被分拆之后,子文件中的log输出,好像无法直接使用logging了。
然后只能使用print,很是不爽。
现在希望,子文件中的logging和主文件中的logging的输出,都输出到同一个log文件,即主文件所生成的那个log文件中。
【解决过程】
1.由于之前刚搞懂关于py模块被当做子模块调用之前的初始化:
所以首先想到的是,在子模块初始化中,也同样使用logging,然后单独生成自己的logging文件,测试代码如下:
#------------------------------------------------------------------------------ if __name__=="BlogNetease": print "BlogNetease is imported from others"; logging.basicConfig( level = logging.DEBUG, filename = "BlogNetease.log", filemode = 'w', ); logging.info("logging output info from BlogNetease is OK ."); print "BlogNetease import end";
测试出来的结果很是诡异,好像是子文件再次配置的logging,把主文件的logging文件劫持了,然后接下来的输出,都输出到子文件的log文件中了。这不是我所希望的,每个py文件都有自己单独的log文件。
2.后来无意中发现,对于子文件,完全不需要多余额外设置,只需要:
import logging;
然后直接使用logging.info,logging.debug函数,即可实现把日志内容输出去,具体输出的形式,取决于主文件用logging.basicConfig所配置的形式。输入的位置,即主文件的log文件。
这样,至少可以很好地实现,将多个py文件的logging内容都输出到同一个主文件的log文件中,并且格式都是设置好的,统一的。
【总结】
主文件设置好logging.basicConfig相关参数,配置好StreamHandler等内容后,子文件,只需要导入logging模块,然后调用logging.info,logging.debug函数,即可实现将log信息,都输入到主文件的log中了。