【发布时间】:2016-04-16 01:20:34
【问题描述】:
我们按照 django 文档告诉我们的方式设置日志记录:
https://docs.djangoproject.com/en/2.1/topics/logging/#using-logging
# import the logging library
import logging
# Get an instance of a logger
logger = logging.getLogger(__name__)
def my_view(request, arg1, arg):
...
if bad_mojo:
# Log an error message
logger.error('Something went wrong!')
我想在每个想要记录的 Python 文件中避免这一行:
logger = logging.getLogger(__name__)
我希望它简单:
logging.error('Something went wrong!')
但我们想保留一个特性:我们想在日志输出中看到 Python 文件名。
到目前为止,我们使用这种格式:
'%(asctime)s %(name)s.%(funcName)s +%(lineno)s: %(levelname)-8s [%(process)d] %(message)s'
示例输出:
2016-01-11 12:12:31 myapp.foo +68: ERROR Something went wrong
如何避免logger = logging.getLogger(__name__)?
【问题讨论】:
-
通常情况下,我对你不应该这样做的问题感到恼火。不过,在这里,我不得不说这似乎是个坏主意。 “简单”,在 Pythonic 意义上和日志记录并没有真正对齐。日志是受 Java 启发的,虽然功能强大,但使用起来很棘手。我最初错误地按照您的建议进行了操作,并且正在使用 logging.error() 等。这最终使我在配置和过滤能力方面受到了打击,因为这不是它的预期使用方式。 YMMV,但我会在别处寻找简化。每个模块节省 1 行?干什么用的?
-
这一行是允许每个模块配置日志记录的内容。例如,降低您当前正在排除故障的模块上的日志记录阈值(即更详细)而不影响其他模块。把它扔掉,使用提供的日志记录模块的许多理由变得可疑。
-
我对您的“那一行是允许每个模块配置日志记录。”的回复:我喜欢 DevOps:开发人员应该知道如何操作(例如 nagios),操作员应该知道如何开发。我喜欢的下一件事:区分两者。配置日志记录是“操作”。 Python代码是“开发”。这就是我不想修改代码来更改日志记录配置的原因。
-
@guettli,您似乎误解了日志记录的配置方式。这个
__name__变成类似于'abc.qwe.zxc'的东西,默认情况下,记录的所有内容都由根记录器捕获,然后在单独的配置文件中,您可以将特定记录器分配给'abc.qwe'命名空间并告诉它不要将事件传播到根记录器,而是静音或登录到单独的处理程序(文件)。您不必修改源代码来配置日志记录。由于该模块基本上是 python 的 log4j,因此大多数管理员和开发人员都了解如何在您的应用程序中配置 looffing。