使用多个模块进行Python日志记录的常见/标准做法是什么?

时间:2013-12-10 16:11:16

标签: python logging coding-style standards python-2.6

我们说我有一个依赖于两个模块的脚本:

  • Main.py
  • Module1.py
  • Module2.py

只会执行Main.py,但在Main的执行中,有几次调用Module1.py和Module2.py中的方法。

更常见的是......

1)将所有内容记录到Main.py的日志中?

2)将所有内容记录到每个操作的相应模块的日志中?

(如果您理解我的问题,那么博士,那么就没有必要继续阅读。否则,这是一个例子):


示例(使用非常简短的代码):

案例#1 只有一个日志文件,我们称之为Main.log。假设记录器名称没有硬编码(虽然在这个例子中),所以我应该以AnotherMain.py为例,所有日志条目都将进入AnotherMain.log

Main.py:

some_value = Module1.get_value("abc")
some_other_value = Module2.get_value("def")
some_result = some_value + some_other_value
log("main", "some_result evaluated successfully")

Module1.py:

def get_value(key):
   ...
   log("main", "returning value for key from Module1")

Module2.py:

def get_value(key):
   ...
   log("main", "returning value for key from Module2")

这将导致Main.log读取:

some_result evaluated successfully
returning value for key from Module1
returning value for key from Module2

案例#2 有三个日志文件,每个模块一个:Main.log,Module1.log,Module2.log。

Main.py:

some_value = Module1.get_value("abc")
some_other_value = Module2.get_value("def")
some_result = some_value + some_other_value
log("main", "some_result evaluated successfully")

Module1.py:

def get_value(key):
   ...
   log("Module1", "returning value for key")

Module2.py:

def get_value(key):
   ...
   log("Module2", "returning value for key")

这将导致三个日志,每个日志只有一行说明该模块中发生的事情。

我没有问,"你更喜欢哪个,"但更确切地说,这是更标准和更常见的?一旦我走了,我的继任者会更快乐地处理和维护吗?

1 个答案:

答案 0 :(得分:2)

最佳做法是使用logging library,并将所有内容保留到该库中。

每个模块都使用自己的记录器:

import logging

log = logging.getLogger(__name__)

# ...
log.warn('Do not fnord the frazzle, faf the frobnir instead')

并在主模块中配置日志记录;您可以配置一个日志文件,或者根据需要将特定模块的输出直接发送到特定文件。

默认情况下,记录程序会将所有内容传播到根记录程序,但是如果要设置更复杂的日志记录配置,则每个模块使用单独的记录程序可以在将来提供灵活性。

您可以根据需要调整格式并将日志记录到其他后端。格式化程序有lot of options来调整生成的消息,请确保包含记录器名称。 configuration options for formatting, filtering and handling几乎无穷无尽。

关键是你拥有多少个日志文件以及这些文件的内容是配置的问题。根据需求的变化调整配置。从简单的事情开始;将所有内容记录到一个文件,然后从那里开始。通过为每个模块提供自己的日志记录对象,您可以单独配置每个记录器,保持默认值,并将所有内容传播到根处理程序。