【发布时间】:2014-05-08 00:45:08
【问题描述】:
我有一个应用程序,它根据外部参数运行多个主应用程序实例。主应用程序导入了几个库,这些库又导入了其他库。他们都有一个全球性的
LOGGER = logging.getLogger('module_name')
记录器被配置为文件处理程序,因此所有日志都被写入外部文件(所有日志都写入同一个文件)。现在我想根据传递给主应用程序的某个名称将日志写入不同的文件。我需要一些类似的东西
LOGGER = logging.getLogger(dynamic_criteria_name)
结果将创建多个日志文件 dynamic_criteria_name.log、dynamic_criteria_name.log 等,并且在任何时候从任何模块调用记录器时,它都应根据调用的条件写入正确的文件。
但问题是 LOGGER 是全局的。我可以将记录器或dynamic_criteria_name 传递给每个函数以写入日志,但这听起来有些不对。可能我只是偏执!我有一些模块,有时它们只有功能。我想我不想到处传递记录器。
我曾考虑过 AOP,但我认为它并不是真正的横切,因为它是动态生成的,记录器在我看来是横切的,但在主应用程序的一个实例中。我已经考虑过破解全球状态的其他方法,但我认为动态特性至少在我的脑海中使这一切成为不可能。
下面是伪代码(我还没有尝试过运行它),但它更好地解释了我在说什么。如您所见,module_1 导入module_2 和module_3,它们都有一个全局LOGGER,而module_3 调用module_4。我想知道是否可以从 module_2 或 module_3 写入单独的日志文件,而无需将名称显式传递给每个导入的模块函数。我可以将多个处理程序添加到具有不同文件名的记录器,但我如何从另一个模块引用正确的记录器,因为它们目前都是全局的。
# module_1.py
import logging
import time
import module_2
import module_3
LOGGER = logging.getLogger()
def start_main_loop(name):
while True:
module_2.say_boo()
module_3.say_foo()
LOGGER.debug('Sleeping...')
time.sleep(10)
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG)
for i in xrange(10):
start_main_loop(i)
#----------------------------------------------------
# module_2.py
import logging
LOGGER = logging.getLogger()
def say_boo():
msg = 'boo'
LOGGER.debug(msg)
LOGGER.debug(say_twice(msg))
def say_twice(msg):
LOGGER.debug('Called say twice')
return msg * 2
#----------------------------------------------------
# module_3.py
import logging
import module_4
LOGGER = logging.getLogger()
def say_foo():
msg = 'foo'
LOGGER.debug(msg)
LOGGER.debug(say_twice(msg))
module_4.say_bar()
def say_twice(msg):
LOGGER.debug('Called say twice')
return msg * 2
#----------------------------------------------------
# module_4.py
import logging
LOGGER = logging.getLogger()
def say_bar():
msg = 'bar'
LOGGER.debug(msg)
我愿意探索人们可能有的任何想法。希望我已经清楚地解释了自己,如果没有请告诉我,我可以改写这个问题。谢谢!
【问题讨论】:
-
每个模块都可以使用
__name__作为记录器名称。如果要将函数名称添加到记录器名称中,则每个函数都有func_name属性。 -
抱歉 - 我需要基于动态名称的不同日志文件。
-
您可以在一个记录器中拥有任意数量的处理程序,这应该不是问题。
-
不确定处理程序是否是我的问题。我想知道如何将记录器引用或条件传递给其他模块,而不必将它们作为参数显式传递给函数调用。
-
您需要描述您希望将哪些消息放入哪些文件中。此外,您的示例看起来有错误 -
logging.getLogger('Sleeping...')看起来有误。
标签: python python-2.7 logging dynamic