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

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


转载:https://www.crifan.com/python_output_multiple_script_logging_into_single_log_file/

【问题】

有一个比较长的python脚本文件,其中关于log日志输出,用的是logging,对应初始化代码为:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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文件,测试代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
#------------------------------------------------------------------------------  
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中了

猜你喜欢

转载自blog.csdn.net/feng98ren/article/details/80044019