Python中,如何让多个py文件的logging输出到同一个日志log文件



【问题】

有一个比较长的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模块被当做子模块调用之前的初始化:

【已解决】Python中,模块被导入之前,如何初始化

所以首先想到的是,在子模块初始化中,也同样使用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中了