gpt4 book ai didi

python - 在 Python 中使用 root logger 还是 named logger 更好

转载 作者:太空狗 更新时间:2023-10-29 17:07:47 35 4
gpt4 key购买 nike

我正在尝试找出跨多个模块使用 python 日志记录的最佳实践。我在这里看到:http://docs.python.org/2/howto/logging#logging-from-multiple-modules关于如何使用根记录器跨多个模块进行记录。正如链接所指出的那样,您无法分辨您的消息在您的应用程序中的位置,因为它们都显示名称“root”。

在我看来有两种选择(假设我的模块不在包结构中,而只是同一文件夹中的一堆模块):

1) 像示例中一样使用根记录器,但更改日志格式以包含文件名:

# myapp.py
import logging
import mylib

def main():
logging.basicConfig(format='%(asctime)s %(filename)s %(levelname)s: %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p', level=logging.INFO) #filename='myapp.log',
logging.info('Started')
mylib.do_something()
logging.info('Finished')

if __name__ == '__main__':
main()

#mylib.py
import logging

def do_something():
logging.info('Do something')




In [4]: import myapp

In [5]: myapp.main()
03/06/2014 12:22:07 PM myapp.py INFO: Started
03/06/2014 12:22:07 PM mylib.py INFO: Do something
03/06/2014 12:22:07 PM myapp.py INFO: Finished

2) 在主应用程序中使用根记录器,但在子模块中使用命名记录器,并在日志格式中使用“名称”而不是“文件名”:

# myapp.py
import logging
import mylib

def main():
#logging.basicConfig(format='%(asctime)s %(filename)s %(levelname)s: %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p', level=logging.INFO) #filename='myapp.log',
logging.basicConfig(format='%(asctime)s %(name)s %(levelname)s: %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p', level=logging.INFO) #filename='myapp.log',
logging.info('Started')
mylib.do_something()
logging.info('Finished')

if __name__ == '__main__':
main()

#mylib.py
import logging

def do_something():
#logging.info('Do something')
logger = logging.getLogger(__name__)
logger.info('Do something')



In [3]: import myapp

In [4]: myapp.main()
03/06/2014 12:27:29 PM root INFO: Started
03/06/2014 12:27:29 PM mylib INFO: Do something
03/06/2014 12:27:29 PM root INFO: Finished

最佳答案

Vinay Sajip(日志模块的维护者)制作了一个 recommendation here这与您的选项 #2 类似,除了您可以在任何地方使用命名记录器,甚至在 myapp 中也是如此:

import logging
import mylib
logger = logging.getLogger(__name__)

def main():
logging.basicConfig(format='%(asctime)s %(module)s %(levelname)s: %(message)s',
datefmt='%m/%d/%Y %I:%M:%S %p', level=logging.INFO)
logger.info('Started')
mylib.do_something()
logger.info('Finished')

if __name__ == '__main__':
main()

产生

03/06/2014 12:59:25 PM myapp INFO: Started
03/06/2014 12:59:25 PM mylib INFO: Do something
03/06/2014 12:59:25 PM myapp INFO: Finished

请注意,如果您使用 %(module)s 而不是 %(name)s,那么您会在获得之前得到 myapp rootmyapp.py,或 __main__

如果 myapp 有时作为脚本调用,有时作为模块导入,这种始终使用 logger 的对称性可能特别有用。

关于python - 在 Python 中使用 root logger 还是 named logger 更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22231809/

35 4 0