最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

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

Python crifan 11007浏览 0评论

【问题】

有一个比较长的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中了。

转载请注明:在路上 » 【已解决】Python中,如何让多个py文件的logging输出到同一个日志log文件

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (1)

  1. 正好遇到过1中的这个问题:“对 basicConfig() 的调用应该在 debug() , info() 等的前面。因为它被设计为一次性的配置,只有第一次调用会进行操作,随后的调用不会产生有效操作。”--https://docs.python.org/zh-cn/3/howto/logging.html#logging-advanced-tutorial
    浊仁5年前 (2020-02-03)回复
85 queries in 0.184 seconds, using 22.15MB memory