Django-logdb使您能够将条目记录到数据库,并定期汇总它们。
项目描述
DJANGO-LOGDB
Django-logdb使您能够将条目记录到数据库,根据某些规则对它们进行聚合和操作,并让您更深入了解正在发生的事情。
Django-logdb需要Django 1.1及以上版本。
描述
Django-logdb有一个自定义的日志处理程序,将日志条目写入数据库。因此,它可以很好地与您现有的日志配置集成,您可以决定哪些日志条目写入数据库。
Django管理站点扩展了最近日志条目的图形视图,以提供更多关于正在发生的事情的见解。日志消息按日志级别或“日志条目类型”分组。
为了最小化数据库访问,聚合是通过Django命令完成的,您可以定期调用该命令(例如,作为cron作业)。
安装
安装此包的最简单方法是使用setuptools
easy_install django-logdb
安装后,更新您的Django settings.py 文件,并将 djangologdb 添加到您的 INSTALLED_APPS
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', ... 'djangologdb', )
在您的Django urls.py 文件中,在admin之前包含 djangologdb.urls
urlpatterns = patterns('', ... (r'^admin/djangologdb/', include('djangologdb.urls')), ... (r'^admin/', include(admin.site.urls)), )
可选的,如果您想记录异常,请添加中间件
MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', ... 'djangologdb.middleware.LoggingMiddleware', )
运行 python manage.py syncdb 创建数据库表。
设置日志
现在,对于实际的日志记录部分,您应使用数据库日志处理程序。有两种方法可以实现这一点:仅使用Python代码,或者使用配置文件。下面将解释这两种方法。
例如,要将此处理程序通过Python添加到根日志记录器中,您可以在Django的settings.py文件中添加以下内容:
import logging from djangologdb.handler import DjangoDatabaseHandler, add_handler logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger() # A bug in Django causes the settings to load twice. Using # this handler instead of logging.addHandler works around that. add_handler(logger, DjangoDatabaseHandler())
要使用配置文件通过此处理程序,请先从djangologdb的handlers模块导入,然后在Django的settings.py文件中加载配置文件之前
from djangologdb import handlers logging.config.fileConfig(...)
然后在您的日志配置文件中,您可以从处理程序命名空间添加它,并将其添加到任何您想要的日志记录器中
[handlers] keys=djangologdb [logger_root] level=NOTSET handlers=djangologdb [handler_djangologdb] class=handlers.DjangoDatabaseHandler args=()
配置
您可以在Django的settings.py文件中设置以下设置
- LOGDB_HISTORY_DAYS
显示在各个图形中的天数。
默认
LOGDB_HISTORY_DAYS = 30
- LOGDB_INTERVAL
各个图形中每个数据点之间的时间间隔。
默认
LOGDB_INTERVAL = datetime.timedelta(1) # 1 day
- LOGDB_RULES
定义规则,当某些条件为真时创建新的日志条目。
默认
LOGDB_RULES = [{ # If 3 logs with level WARNING or higher occur in 5 minutes or # less, create a new log with level CRITICAL. 'conditions': { 'min_level': logging.WARNING, 'qualname': '', 'min_times_seen': 3, 'within_time': datetime.timedelta(0, 5 * 60), }, 'actions': { 'level': logging.CRITICAL, } }]
- LOGDB_LEVEL_COLORS
为基于级别的数据集设置要在图中使用的颜色。
默认
LOGDB_LEVEL_COLORS = { logging.DEBUG: '#c2c7d1', logging.INFO: '#aad2e9', logging.WARNING: '#b9a6d7', logging.ERROR: '#deb7c1', logging.CRITICAL: '#e9a8ab', }
- LOGDB_MEDIA_ROOT
设置绝对路径,指向django-logdb媒体目录。
默认
LOGDB_MEDIA_ROOT = os.path.join(djangologdb.__path__[0], 'media')
- LOGDB_MEDIA_URL
设置处理从LOGDB_MEDIA_ROOT提供的媒体的URL。确保在末尾添加斜杠。如果settings.DEBUG=True,媒体将由Django提供。
默认
LOGDB_MEDIA_URL = '/admin/djangologdb/media/'
命令
- aggregate_logs
聚合日志条目并触发任何匹配规则的行动。
- 用法:
python django-admin.py aggregate_logs
- 选项:
- -s, --skip-actions
不使用规则创建新日志。
- --cleanup=CLEANUP
指定保留日志条目的天数并删除其余条目。
常见问题解答
- 图形未在Django管理中显示。
如果您没有settings.DEBUG=True,则Django不会提供媒体。您应该将媒体目录复制到自己的媒体目录,并相应地设置LOGDB_MEDIA_ROOT和LOGDB_MEDIA_URL。
示例
LOGDB_MEDIA_ROOT = '/myproject/media/djanglogdb/' LOGDB_MEDIA_URL = '/media/djanglogdb/'
除了复制之外,您还可以使用Apache的Alias指令提供静态文件,就像您可能也为Django自己的媒体文件所做的那样。这里解释如下:https://docs.django.ac.cn/en/dev/howto/deployment/modwsgi/#serving-media-files 这归结为将以下行添加到您的虚拟主机条目中
Alias <your LOGDB_MEDIA_URL setting> <path to django-logdb media dir>
示例
Alias /admin/djangologdb/media/ /myproject/eggs/django_logdb-0.9.5-py2.6.egg/djangologdb/media/
- django-logdb的Django管理页面加载非常慢。
如果您图形中有许多数据点,它将执行许多查询。这可能需要一些时间。您应该减少时间范围或增加间隔。默认情况下,使用最后30天,间隔为1天,结果为30个数据点。请参阅设置LOGDB_HISTORY_DAYS和LOGDB_INTERVAL。
- 为什么每个数据点都会执行1个查询?
Django(目前)不允许按某些日期信息分组。尽管在数据库中存储了时间戳,但没有方法告诉Django ORM按日、按小时等分组。我使用的解决方案是过滤/限制构建一个数据点所需的结果。
- 当我运行我的测试时,我看到ERROR:djangologdb.middleware [...]
当您运行测试项目时,配置设置为将任何错误也显示在sys.stderr上。如您所见,所有测试都成功,但测试中测试的异常只是显示在控制台。这不是错误!
您可以通过禁用测试配置的日志记录到控制台来禁用此行为(例如,删除处理程序)。
- 为什么模板扩展Django基本模板的本地版本?
这是为了在自定义模板方面具有最佳灵活性。类似于Grappelli的皮肤会覆盖许多模板,有时您希望能够更改并使用django-logdb中的基本模板,同时在django-logdb模板本身中更改一些具体内容,而无需复制所有基本模板内容。
测试项目
testproject是django-logdb的一个示例安装。它提供了一个Django 1.1和Django 1.2的设置文件,仅用于运行。
在testproject以下目录中创建一个虚拟环境
$ virtualenv . $ source bin/activate
安装Django并使用您Django版本的设置文件之一运行内部服务器。
$ bin/python bin/pip install django $ bin/python bin/django-admin.py runserver –settings=testproject.settings_django_1_1
感谢
感谢所有帮助使这个项目变得越来越好的人们
Maciek Szczesniak(vvarp)
Victor van den Elzen
感谢David Cramer在django-db-log(http://github.com/dcramer/django-db-log/)上的工作,本包基于此。
变更记录
1.0
将jQuery更改为使用noConflict以更好地与其他框架兼容。
添加了Django 1.1和Django 1.2的设置文件。
添加了测试项目启动的简要说明。
0.9.11
修复了一个问题,在单元测试运行之前,应用程序向表中添加日志条目,导致django-logdb的单元测试失败。
0.9.10
修复了在具有现有日志配置的项目中使用django-logdb测试套件的问题。
将testproject更新到Django 1.2。
添加了许可文件(MIT)(抱歉Jacob)。
0.9.9
在清单文件中添加了LogEntry模板。
修复了当传递的消息不是字符串时发生的问题。
0.9.8
使用int64兼容的字段来存储线程ID(vvarp)。
修复了传递给日志记录参数的无效字符问题。
0.9.7
日志聚合现在在事务中完成。
修改模板以允许更容易的自定义。
修复了在Python 2.5中发生的tests.py中的错误。
添加了两个新设置:INTERVAL和HISTORY_DAYS,默认值与之前相同。
将JS代码从extrastyle移动到模板中的extrahead块。
0.9.6
更新了README以包括媒体服务示例。
修复了将对象或实例作为日志记录参数保存时的问题(picklefield)。
修复了参数中的Unicode字符问题。
将库picklefield替换为JSONField和TupleField。
0.9.5
删除了Django作为要求(尽管仍然是必需的),以防止与djangorecipe冲突。
0.9.4
修复了清单以包括更改。
0.9.3
添加了LogEntry视图模板。
将模板重命名为Django的默认模板。您仍然可以覆盖它们。
0.9.2
在PyPI上的首次发布。