将 Django Log 消息存储在数据库中?

Posted

技术标签:

【中文标题】将 Django Log 消息存储在数据库中?【英文标题】:Store Django Log messages in a database? 【发布时间】:2012-08-06 22:31:09 【问题描述】:

Django(python web 框架)使用 python 的日志系统来存储日志。

有没有一种简单的方法可以将日志消息存储在数据库中,然后允许管理员用户通过网络查看它们?这是我可以自己写的东西,但没有必要重新发明***。我不想记录异常,但我已添加到代码中的 info/debug/notice 类型的消息。

理想情况下,我希望能够在完成后存储有关日志消息的元数据(如远程 IP 地址、用户代理、wsgi 进程 ID 等),然后基于此过滤/浏览(即显示我在过去 24 小时内来自此 IP 地址的所有日志消息)。有人做过吗?

【问题讨论】:

【参考方案1】:

只需使用Sentry。 Raven,Django 的功能部分与日志框架挂钩,因此除了从您的应用收集错误之外,还应显示任何自定义日志消息。

【讨论】:

尽管我喜欢哨兵等,但它并没有回答这个问题。我对数据库记录器处理程序感兴趣。有人吗? 我一直在寻找同样的东西,但我发现 Sentry 并不能完全取代日志记录。请参阅sentry.io/vs/logging“Sentry 不保证允许您找到准确的历史错误。因此,在您确实需要能够跟踪事件的情况下,您必须在现有的日志记录基础设施中维护它们。” 【参考方案2】:

尝试 django-requests。我已经尝试过了,它基本上只是将请求日志放在一个名为 requests 的表中。

【讨论】:

链接?我找到了一个“django-request”。 pypi.org/project/django-request 更好的链接:github.com/django-request/django-request【参考方案3】:

除了显而易见的选择 Sentry 之外,为了练习,在“James Lin 博客”中有一篇名为“Creating custom log handler that logs to database models in django”的不错的博客文章,其中简要说明了如何使用第二个数据库来做到这一点,其中代码示例。

代码改编自标准Python RotatingFileHandler:

...RotatingFileHandler 允许您指定要写入和旋转文件的文件,因此我的 DBHandler 还应该允许您指定要插入的模型并在设置中指定到期时间,最重要的是,在独立应用程序上.

这也可以很容易地适应使用单个数据库。

【讨论】:

附言。故意不包括代码本身,让我知道是否需要这样做。【参考方案4】:

检查 django-db-logger

整合不到一分钟

https://github.com/CiCiUi/django-db-logger

【讨论】:

这是惊人的极简主义【参考方案5】:

您可以查看我在here 发布的一个好的解决方案。您只需要一个字符串连接即可连接到您的数据库。例如,如果您使用 mysql,则连接字符串应为:

# mysqlclient
'mysql+mysqldb://username:password@host:port/database'

# PyMySQL
'mysql+pymysql://username:password@host:port/database')

然后您可以使用phpMyAdmin 作为“MySQL 网络管理工具”通过网络浏览器查看数据库或使用DataGrip(我的偏好)远程访问任何数据库。


要在 Django 中使用处理程序,您只需将处理程序类添加到 setting.py 的 LOGGING 变量中,如下所示:

level = 'INFO' if DEBUG else 'WARNING'  # I prefer INFO in debugging mode and WARNING in production
handler = ['log_db_handler', ]  # In production I rarely check the server to see console logs
if DEBUG:
    handler.append('console')

LOGGING = 'version': 1,
           'disable_existing_loggers': False,

           'formatters': 'verbose': 'format': 'levelname message',  # asctime module process:d thread:d
                                      'style': '', , ,

           'handlers': 'log_db_handler': 'level': level,
                                           'class': 'db_logger.handlers.DBHandler',
                                           'formatter': 'verbose', ,
                        'console': 'class': 'logging.StreamHandler', ,

           'loggers': 'db_log': 'handlers': handler,
                                  'level': level,
                                  'propagate': False, ,
                       'django': 'handlers': handler,
                                  'level': level,
                                  'propagate': True, ,
                       'django.request': 'handlers': handler,
                                          'level': level,
                                          'propagate': True, 

注意 'db_logger.handlers.DBHandler' 指向处理程序类。

【讨论】:

以上是关于将 Django Log 消息存储在数据库中?的主要内容,如果未能解决你的问题,请参考以下文章

Kafka数据存储

如何将 django csrf 令牌直接嵌入 HTML?

提交表单html django

kafka存储结构以及Log清理机制

无法将 DM 发送到消息到 DB discord.js 中的存储用户

在 Django 模型中存储与外键关联的数据