将 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 消息存储在数据库中?的主要内容,如果未能解决你的问题,请参考以下文章