【问题标题】:Avoid `logger=logging.getLogger(__name__)` without loosing way to filter logs避免使用 `logger=logging.getLogger(__name__)` 而不会丢失过滤日志的方法
【发布时间】:2016-12-21 12:24:41
【问题描述】:

我很懒,想在每个使用日志记录的 python 文件中避免这一行:

logger = logging.getLogger(__name__)

1 月份我询问了如何做到这一点,并找到了答案:Avoid `logger=logging.getLogger(__name__)`

不幸的是,那里的答案有一个缺点,就是你失去了过滤的能力。

我真的很想避免这种无用和多余的行。

例子:

import logging

def my_method(foo):
    logging.info() 

不幸的是,如果 logging.info() 在此文件中第一次被调用,我认为不可能隐式执行 logger = logging.getLogger(__name__)

有没有人知道如何做不可能的事情?

更新

我喜欢Don't Repeat Yourself。如果大多数文件在顶部包含同一行,我认为这是重复。它看起来像WET。每次我看那里时,我脑海中的 python 解释器都需要跳过这一行。我的主观感受:这条线是没用的臃肿。该行应该是隐式默认值。

【问题讨论】:

  • 在模块顶部定义一行真的那么难吗?您已经必须输入 import logging
  • @MartijnPieters 我没有输入“导入日志”。我有一个 IDE 可以做到这一点。我在方法中键入“logging.[MAGIC-KEY-STROKE]”,IDE 在顶部插入导入语句。是的,我不想输入这一行。肿了我想要更少的代码,而不是更多。
  • 不是臃肿;这是一个明确的声明,您想要一个具有该名称的记录器对象。如果您不关心名称,则可以在包中为所有子模块重用该记录器。您可以轻松地使用不同的名称层次结构。此外,其他任何事情都需要具有自定义 __getattr__ 的自定义模块子类,然后检查调用框架中的全局变量中的 __name__ 键以生成相同的对象。 Python 更喜欢显式而不是这种魔法。
  • 如果您使用的是 IDE,那么它可能是 IDE 为您做的事情。也许它具有自动扩展的 sn-p 支持?您键入logger<TAB> 并为您插入导入和getLogger(__name__) 调用?这不是 Python 必须为您解决的问题。
  • @MartijnPieters 你说“这不是臃肿”。我更新了问题。请参阅“更新”。但我认为我添加的这一段并没有添加任何实质性内容。

标签: python logging


【解决方案1】:

如果你真的想这样做,请好好考虑。

创建一个模块,例如magiclog.py 像这样:

import logging
import inspect

def L():
    # FIXME: catch indexing errors
    callerframe = inspect.stack()[1][0]
    name = callerframe.f_globals["__name__"]
    # avoid cyclic ref, see https://docs.python.org/2/library/inspect.html#the-interpreter-stack
    del callerframe
    return logging.getLogger(name)

那么你可以这样做:

from magiclog import L
L().info("it works!")

【讨论】:

  • 酷,这看起来像是第一步。现在,如果我执行 import logginglogging.info("it works!"),则应该执行此操作
  • 嗯,您当然可以对日志模块中的功能进行monkeypatch,但这样您就真的越界进入了“邪恶”领域。 (即任何继承您的代码的人都会玩得很开心)。
【解决方案2】:

我很懒,想在每个使用的 python 文件中避免这一行 日志记录:

logger = logging.getLogger(__name__)

嗯,这是推荐的方式:

命名记录器时使用的一个很好的约定是使用模块级 logger,在每个使用日志的模块中,命名如下:

logger = logging.getLogger(__name__)

这意味着记录器名称跟踪包/模块层次结构,并且 从记录器中记录事件的位置直观地很明显 名字。

这是来自官方howto的引用。

我喜欢不要重复自己。如果大多数文件在 顶,我认为这是重复。它看起来像湿的。蟒蛇 每次我看时,我脑海中的解释器都需要跳过这一行 那里。我的主观感受:这条线是没用的臃肿。线 应该是隐式默认值。

它遵循“显式优于隐式”。无论如何,您可以在许多 IDE 中轻松更改 python 模板以始终包含此行或创建新的模板文件。

【讨论】:

  • 现在来点完全不同的东西,但不要太认真:熨烫袜子是几年前的推荐方式。每个好家庭主妇都这样做。大多数人停止这样做毫无意义。
  • 我遇到了 99 个编程问题,但没有一个明确的用于记录设置的单行代码。这是我不认真的回答。
猜你喜欢
  • 2016-04-16
  • 1970-01-01
  • 1970-01-01
  • 2015-02-06
  • 2014-12-12
  • 1970-01-01
  • 2021-10-09
  • 1970-01-01
  • 2015-07-07
相关资源
最近更新 更多