gpt4 book ai didi

python - Django 中 Python 日志记录的优雅设置

转载 作者:IT老高 更新时间:2023-10-28 21:08:58 25 4
gpt4 key购买 nike

我还没有找到让我满意的使用 Django 设置 Python 日志记录的方法。我的要求很简单:

  • 针对不同事件的不同日志处理程序 - 也就是说,我希望能够记录到不同的文件
  • 轻松访问我的模块中的记录器。该模块应该能够轻松找到它的记录器。
  • 应该很容易适用于命令行模块。系统的一部分是独立的命令行或守护进程。这些模块应该可以轻松使用日志记录。

我当前的设置是使用 logging.conf 文件并在我登录的每个模块中设置日志记录。感觉不对。

您有喜欢的日志记录设置吗?请详细说明:您如何设置配置(您是使用 logging.conf 还是在代码中设置),您在何处/何时启动记录器,以及如何访问它们你的模块等等。

最佳答案

我知道这已经是一个已解决的答案,但是根据 django >= 1.3 有一个新的日志记录设置。

从旧到新不是自动的,所以我想我会在这里写下来。

当然还有结帐 the django doc更多。

这是基本配置,默认使用 django-admin createproject v1.3 创建 - 里程可能会随着最新的 django 版本而改变:

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
}
}
}

此结构基于标准 Python logging dictConfig ,这决定了以下 block :

  • formatters - 对应的值将是一个字典,其中每个键是一个格式化程序 id,每个值是一个描述如何配置相应 Formatter 实例的字典。
  • filters - 对应的值将是一个字典,其中每个键都是一个过滤器 id,每个值是一个描述如何配置相应过滤器实例的字典。
  • handlers - 对应的值将是一个字典,其中每个键是一个处理程序 ID,每个值是一个描述如何配置相应处理程序实例的字典。每个处理程序都有以下键:

    • class(强制)。这是处理程序类的完全限定名称。
    • 级别(可选)。处理程序的级别。
    • 格式化程序(可选)。此处理程序的格式化程序的 ID。
    • 过滤器(可选)。此处理程序的过滤器 ID 列表。

我通常至少会这样做:

  • 添加 .log 文件
  • 配置我的应用程序以写入此日志

翻译成:

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
},
'simple': {
'format': '%(levelname)s %(message)s'
},
},
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'handlers': {
'null': {
'level':'DEBUG',
'class':'django.utils.log.NullHandler',
},
'console':{
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
# I always add this handler to facilitate separating loggings
'log_file':{
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(VAR_ROOT, 'logs/django.log'),
'maxBytes': '16777216', # 16megabytes
'formatter': 'verbose'
},
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
'apps': { # I keep all my of apps under 'apps' folder, but you can also add them one by one, and this depends on how your virtualenv/paths are set
'handlers': ['log_file'],
'level': 'INFO',
'propagate': True,
},
},
# you can also shortcut 'loggers' and just configure logging for EVERYTHING at once
'root': {
'handlers': ['console', 'mail_admins'],
'level': 'INFO'
},
}

编辑

request exceptions are now always loggedTicket #16288 :

我更新了上面的示例 conf 以明确包含正确的 mail_admins 过滤器,因此默认情况下,当 debug 为 True 时不会发送电子邮件。

你应该添加一个过滤器:

'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},

并将其应用于 mail_admins 处理程序:

    'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
}

否则,如果 settings.DEBUG 为 True,django.core.handers.base.handle_uncaught_exception 不会将错误传递给 'django.request' 记录器。

如果你不在 Django 1.5 中这样做,你会得到一个

DeprecationWarning: You have no filters defined on the 'mail_admins' logging handler: adding implicit debug-false-only filter

但在 django 1.4 和 django 1.5 中,事情仍然可以正常工作。

** 结束编辑 **

该 conf 受到 django 文档中的示例 conf 的强烈启发,但添加了日志文件部分。

我也经常做以下事情:

LOG_LEVEL = 'DEBUG' if DEBUG else 'INFO'

...
'level': LOG_LEVEL
...

然后在我的 python 代码中,我总是添加一个 NullHandler 以防万一没有定义任何日志记录配置。这避免了未指定处理程序的警告。对于不一定只在 Django (ref) 中调用的库特别有用

import logging
# Get an instance of a logger
logger = logging.getLogger(__name__)
class NullHandler(logging.Handler): #exists in python 3.1
def emit(self, record):
pass
nullhandler = logger.addHandler(NullHandler())

# here you can also add some local logger should you want: to stdout with streamhandler, or to a local file...

[...]

logger.warning('etc.etc.')

希望这会有所帮助!

关于python - Django 中 Python 日志记录的优雅设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1598823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com