【问题标题】:Log from multiple python files into single log file in Python从多个 python 文件记录到 Python 中的单个日志文件
【发布时间】:2017-08-15 21:00:47
【问题描述】:

我有多个 python 文件,我需要将多个 python 文件记录到一个通用日志文件中。我不想使用日志配置文件进行格式化或 json 字典。每个 python 文件都被导入到一个主 python 文件 kickstart.py 中,它们都是从 kickstart.py 调用的。我想将来自主 python 脚本调用的各种 python 模块的所有消息记录到一个日志文件中。 请建议方法做到这一点。我浏览了 python 食谱,但这没有帮助。我对此很陌生。

谢谢

【问题讨论】:

标签: python python-2.7 logging


【解决方案1】:

您可以使用logging 模块来做到这一点。在您的一个基本模块中定义此函数,并在您想要记录某些内容的每个模块中调用它。

import logging
def get_logger(name):
    log_format = '%(asctime)s  %(name)8s  %(levelname)5s  %(message)s'
    logging.basicConfig(level=logging.DEBUG,
                        format=log_format,
                        filename='dev.log',
                        filemode='w')
    console = logging.StreamHandler()
    console.setLevel(logging.DEBUG)
    console.setFormatter(logging.Formatter(log_format))
    logging.getLogger(name).addHandler(console)
    return logging.getLogger(name)

然后从您要记录的每个模块中,使用您想要的记录器名称调用此函数,您的所有模块将打印到由filename 参数定义的同一日志文件。

<base.py>
logger = get_logger('base')
logger.info('testing logger from module base')

<module2.py>
logger = get_logger('module2')
logger.info('testing logger from module module2')

<dev.log>
2017-08-11 00:34:00,361     base   INFO  testing logger from module base
2017-08-11 00:34:00,361     module2   INFO  testing logger from module module2

logging.basicConfig()

【讨论】:

    【解决方案2】:

    @Chen 的回答是对的。我提供了一个具体的用例如下:

    假设您有两个 python 文件 py1.pypy2.py 想要导入到您的主文件 master.py

    #py1
    import logging
    def fun1():
        LOGGER = logging.getLogger(__name__)
        LOGGER.info('fun1 runs')
    
    #py2
    import logging
    def fun2():
        LOGGER = logging.getLogger(__name__)
        LOGGER.info('fun2 runs')
    
    #master.py
    import py1
    import py2
    import logging
    def main():
        logging.basicConfig(filename='log.log',level=logging.INFO)
        LOGGER = logging.getLogger("main")
        py1.fun1()
        py2.fun2()
        LOGGER.info('Master runs')
    
    if __name__ == "__main__":
        main()
    

    然后执行master.py 将生成一个单独的log.log 文件,其中包含来自所有模块(py1.pypy2.py)的日志记录。

    【讨论】:

    • 如果我想使用 logging.FileHandler 而不是 basicConfig,这个例子会怎样?
    猜你喜欢
    • 1970-01-01
    • 2014-04-12
    • 2018-12-26
    • 2011-07-31
    • 2020-03-27
    • 2021-08-01
    • 1970-01-01
    • 2020-01-03
    • 2011-01-03
    相关资源
    最近更新 更多