【问题标题】:Ideas on dynamic python logging关于动态 python 日志记录的想法
【发布时间】: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


【解决方案1】:

您不需要传递记录器:记录器是单例的。如果多个模块中的代码调用getLogger('foo'),则每次调用都会返回相同的实例。所以没有必要传递记录器实例。通常,记录器名称指示记录调用的来源,因此__name__ 值最有意义。您可以将模块 foo 中的代码记录到名为 bar 的记录器中 - 没有什么可以阻止您这样做 - 只是在实践中没有发现它特别有用。

听起来 AOP 有点过头了。您可以考虑向根记录器添加多个处理程序,而不是传递记录器名称,并在每个处理程序上使用特定过滤器,以确保根据您的特定要求将特定内容放入特定文件中。

【讨论】:

  • 我用一个例子更新了我的问题。如果你能用一些代码解释你的想法,那就太好了。我知道我可以向记录器添加多个处理程序(我使用过 RotatingFileHandler),但我之前没有使用过过滤器。我正在努力获得的部分是如何根据给定的上下文(例如我的示例中的“名称”)拥有多个全局 LOGGER 实例。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
相关资源
最近更新 更多