Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么使用logger而不是在python中登录?_Python_Python 3.x_Logging - Fatal编程技术网

为什么使用logger而不是在python中登录?

为什么使用logger而不是在python中登录?,python,python-3.x,logging,Python,Python 3.x,Logging,使用日志记录器而不是将日志。**()放在各处有什么好处 我有两个模块的简单配置: #one.py import two import logging def do_something(): logging.info("ONE do something") two.do_something() def main(): """ Main function. """

使用日志记录器而不是将日志。**()放在各处有什么好处

我有两个模块的简单配置:

#one.py

import two
import logging

def do_something():
    logging.info("ONE do something")
    two.do_something()

def main():
    """
    Main function.
    """

    logging.basicConfig(filename="logs/one.log",\
                    level="INFO",\
                    format='%(asctime)s::%(filename)s::%(funcName)s::%(levelname)s::%(message)s',\
                    datefmt='%Y-%m-%d %H:%M:%S')

    logging.info('Started ONE #######################')

    do_something() 
    logging.info('Finished')

if __name__ == "__main__":
    main()

如果我运行one.py,它将显示如下输出:

2020-11-22 17:49:08::one.py::main::INFO::Started ONE #######################
2020-11-22 17:49:08::one.py::do_something::INFO::ONE do something
2020-11-22 17:49:08::two.py::do_something::INFO::TWO do something
2020-11-22 17:49:08::one.py::main::INFO::Finished
如果我运行模块2,这就是输出

2020-11-22 17:49:08::two.py::main::INFO::Started TWO #######################
正如您所看到的,我能够在输出和输出中定义文件名和函数名 来自这两个模块的日志将进入一个文件“logs/one.log”。这是我要求的行为

使用记录器而不是在主函数中定义日志有什么好处吗

在我看来,通过这种基本设置,日志记录向下传播到导入的模块,并维护我调用的主文件的输出文件和日志级别设置


如果我定义了一个记录器,我需要将is作为参数传递给我正在调用的所有函数,包括导入的模块,这似乎是一个巨大的麻烦,除非我做错了什么。

“如果我定义了记录器,我需要将is作为参数传递给我正在调用的所有函数”-不,你不需要,您可以从
logging.getLogger
函数获取记录器,或者只使用
logging.info
logging.debug
等来使用默认记录器。我想我刚刚找到了它?我必须将logging basicconfig放在每个模块的主函数中,并在文件顶部定义logger。。如果我在每个文件的顶部定义了logging.basic,则导入的模块将覆盖父模块的设置。。我仍然不确定为什么应该使用logger而不是logging,因为这里似乎回答了问题。当logging系统启动时,它会创建一个
logging.logger
的根实例。模块级函数只是根记录器方法的包装(例如,
logging.info
just calls
logging.root.info()
)以方便使用。使用多个特定的记录器对象要灵活得多:对于代码的不同部分,可以有不同的日志记录配置。
2020-11-22 17:49:08::two.py::main::INFO::Started TWO #######################