Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.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
Python 我应该使用日志模块还是日志类?_Python_Python 3.x_Logging - Fatal编程技术网

Python 我应该使用日志模块还是日志类?

Python 我应该使用日志模块还是日志类?,python,python-3.x,logging,Python,Python 3.x,Logging,我用许多模块编写大程序。在同一模块中,我希望使用日志记录。登录Python的最佳实践是什么? 我是否应该使用import standart logging module并在我的每个文件中使用它: #proxy_control.py #!/usr/bin/env python3 import logging class ProxyClass(): def check_proxy(): pass logging.basicConfig(filename

我用许多模块编写大程序。在同一模块中,我希望使用日志记录。登录Python的最佳实践是什么? 我是否应该使用import standart logging module并在我的每个文件中使用它:

#proxy_control.py
#!/usr/bin/env python3

import logging


class ProxyClass():

    def check_proxy():
        pass
        logging.basicConfig(filename='proxy.log', level=logging.INFO)
        logging.info('Proxy work fine')
或者我应该编写一个MyLog类,从默认日志中继承并从所有其他模块中使用它

#proxy_control.py
#!/usr/bin/env python3

import MyLog


class ProxyClass():

    def check_proxy():
        pass
        Mylog.send_log('Proxy work fine')


#my_log.py
#!/usr/env/bin python3

import logging


class MyLog():
     def send_log(value):
         pass

使用日志记录模块,并将日志记录配置留给应用程序的入口点模块,这些模块不应自行配置日志记录

使用日志记录模块,并将日志记录配置留给应用程序的入口点模块,而不应自行配置日志记录

典型的约定是在每个需要日志记录的模块顶部定义一个日志记录程序,然后在整个模块中使用该日志记录程序对象

logger = logging.getLogger(__name__)
通过这种方式,记录器将跟随您的包名称,即package.subpackage.module。这在日志记录模块中很有用,因为记录器根据记录器名称向上传播消息,即parent.child将消息传递给parent。这意味着您可以在顶级记录器上进行所有配置,它将从包中的所有子记录器获取消息。或者,如果其他人正在使用您的库,他们将很容易配置从您的库中获取的日志消息,因为它将具有一致的命名空间

对于库,除非用户明确启用日志消息,否则通常不希望显示日志消息。除非您设置了处理程序,否则Python日志记录将自动记录到stderr,因此您应该向顶级日志记录程序添加一个。这将防止消息自动打印到stderr

logger = logging.getLogger(__name__)
logger.addHandler(logging.NullHandler())

注意-NullHandler是在Python2.7中添加的,对于早期版本,您必须自己实现它。

典型的约定是在每个需要日志记录的模块顶部定义一个日志记录程序,然后在整个模块中使用该日志记录程序对象

logger = logging.getLogger(__name__)
通过这种方式,记录器将跟随您的包名称,即package.subpackage.module。这在日志记录模块中很有用,因为记录器根据记录器名称向上传播消息,即parent.child将消息传递给parent。这意味着您可以在顶级记录器上进行所有配置,它将从包中的所有子记录器获取消息。或者,如果其他人正在使用您的库,他们将很容易配置从您的库中获取的日志消息,因为它将具有一致的命名空间

对于库,除非用户明确启用日志消息,否则通常不希望显示日志消息。除非您设置了处理程序,否则Python日志记录将自动记录到stderr,因此您应该向顶级日志记录程序添加一个。这将防止消息自动打印到stderr

logger = logging.getLogger(__name__)
logger.addHandler(logging.NullHandler())

注意-NullHandler是在Python2.7中添加的,对于早期版本,您必须自己实现它。

Python日志Howto可能很方便回答您的问题:@klauds。谢谢,但我阅读了关于日志的文档,只找到了我应该如何使用默认日志库和模块的信息。我不想知道在程序中构建日志结构的最佳实践是什么。在实际项目中经常选择什么?为什么选择?Python日志Howto可能很方便回答您的问题:@KlausD。谢谢,但我阅读了关于日志的文档,只找到了我应该如何使用默认日志库和模块的信息。我不想知道在程序中构建日志结构的最佳实践是什么。在实际项目中经常选择什么?为什么?感谢您如此详细的回复。但我的主模块位于远程服务器上,而其他模块位于本地PC上。我应该在本地和远程上分开登录吗?或者我也可以像您的答案一样使用远程服务器进行日志记录?@DenisSavenko Python的日志记录模块支持的不仅仅是本地IO流/文件处理程序-请参阅SocketHandler和SMTPHandler的示例,您甚至可以编写自己的日志-因此,即使使用分布式体系结构,您也可以将所有日志放在同一位置。事实上,通过适当的配置,您甚至可以同时进行流或文件的本地日志记录和远程日志记录。但我的主模块位于远程服务器上,而其他模块位于本地PC上。我应该在本地和远程上分开登录吗?或者我也可以像您的答案一样使用远程服务器进行日志记录?@DenisSavenko Python的日志记录模块支持的不仅仅是本地IO流/文件处理程序-请参阅SocketHandler和SMTPHandler的示例,您甚至可以编写自己的日志-因此,即使使用分布式体系结构,您也可以将所有日志放在同一位置。事实上,通过适当的配置,您甚至可以同时进行流或文件的本地日志记录和远程日志记录。