高级持久性错误日志
项目描述
collective.logbook
- 作者::
Ramon Bartl
- 版本::
1.0.0
collective.logbook 插件为开源 Plone CMS 提供了高级的持久错误日志功能。
最新构建状态
主分支 https://github.com/collective/collective.logbook
简介
对于匿名用户,Plone 会生成一个错误页面,其中包含一个错误编号。但这个错误编号该怎么办呢?
您需要登录到您的 Plone 网站上,转到 ZMI,检查错误日志对象,并可能手动构建 URL 以获取正确的错误,例如:
https://127.0.0.1:8080/Plone/error_log/showEntry?id=1237283091.10.529903983894
如果您很幸运,您可以通过这个编号找到错误以进行进一步调查。如果不是,那么可能发生的错误数量已经超过了保留异常的数量,或者如果您运行的是一个带有 ZEO 服务器的集群设置,那么您可能位于错误的 Zope 实例上,或者可能是在之间重启了 Zope 实例,这导致所有已记录的错误重置。
这种表现并不顺畅。
是否有一个更好的“前端”,您可以在此处粘贴错误编号到字段中并搜索它?在 Zope 重启时也保留所有已记录的错误消息?只保留唯一错误,而不是重复的同一错误?当发生新的唯一错误时,通过电子邮件通知,这样您在客户向您发送错误编号之前就已经知道发生了什么?
如果您认为这将很酷,那么 collective.logbook 就是您想要的。
快速入门
安装后,您可以在控制面板中配置日志簿设置
https://127.0.0.1:8080/Plone/@@logbook-controlpanel
所有发生的错误都会在日志簿视图中列出
https://127.0.0.1:8080/Plone/@@logbook
由于日志簿视图显示 Plone 网站上实际发生的错误,它可能在第一次时为空。
为了故意引发错误,collective.logbook 提供了两个 URL 路由,用于在测试目的执行此操作
https://127.0.0.1:8080/Plone/@@error-test
这将引发预期的 RuntimeError,它应该记录在日志簿视图中。多次调用此 URL 应该引用错误,因为具有相同的错误签名。
这意味着,如果您已配置电子邮件通知,则只会通知一次。对于稍后将要描述的 Webhook 也一样。
要模拟不同的错误,您可以浏览此 URL
https://127.0.0.1:8080/Plone/@@random-error-test
这将引发不同的错误,并且多次调用此 URL 将填充日志簿视图中的错误,按最常发生的错误排序,或者更准确地说,最常引用的错误将首先出现。
Web 钩子
collective.logbook 提供了在 Plone 中发生错误时将错误消息通过 HTTP POST 发送到任何 Web 服务的功能。这种行为被称为 Web 钩子。
用例
在“站点设置”>“日志簿”中,您可以输入 HTTP POST 将在回溯上异步执行的 URL。HTTP POST 负载数据来自日志簿的消息,其中包含进一步信息的链接。
安装
这些说明假设您已经有一个构建好的Plone构建包,并且可以运行。
编辑您的buildout.cfg文件,在实例部分查找eggs键。将collective.logbook添加到该列表。您的列表可能看起来像这样
eggs = ... collective.logbook
运行buildout。
通过“站点设置”>“插件”激活插件。
兼容性
此扩展适用于Plone 4和Plone 5。
浏览器测试
启用collective.logbook后,可以轻松查看Plone站点中发生的所有错误
>>> portal = self.getPortal() >>> browser = self.getBrowser() >>> browser.addHeader('Authorization', 'Basic admin:secret') >>> def simulate_error(msg='Test error'): ... try: ... raise RuntimeError(msg) ... except RuntimeError: ... # Acquire the error_log object the same way Zope does. See module: Zope2.App.startup ... import sys ... from Acquisition import aq_acquire ... error_log = aq_acquire(self.portal, '__error_log__', containment=1) ... error_log.raising(sys.exc_info())
请记住一些URL
>>> portal_url = portal.absolute_url() >>> logbook_controlpanel_url = portal_url + "/@@logbook-controlpanel" >>> logbook_test_error_url = portal_url + "/@@error-test" >>> logbook_url = portal_url + "/@@logbook"
浏览到@@logbook视图
>>> browser.open(logbook_url) >>> 'Congratulations, there are 0 Errors in your Plone Site!' in browser.contents True
现在让我们使用@@error-test视图创建一个错误,该视图会引发一个预期的RuntimeError
>>> simulate_error() >>> browser.open(logbook_url) >>> "There are 1 saved (unique) Tracebacks and 0 referenced Tracebacks" in browser.contents True
相同的错误将被引用而不会再次记录
>>> simulate_error() >>> browser.open(logbook_url) >>> "There are 1 saved (unique) Tracebacks and 1 referenced Tracebacks" in browser.contents True
还有一个@@random-error-test视图,它会随机选择不同的回溯进行测试。
可以在@@logbook-controlpanel视图中故意禁用日志簿记录
>>> browser.open(logbook_controlpanel_url) >>> browser.getControl(name="form.widgets.logbook_enabled:list").value = [] >>> browser.getControl(name="form.buttons.save").click()
错误不应再被记录
>>> simulate_error() >>> browser.open(logbook_url) >>> "There are 1 saved (unique) Tracebacks and 1 referenced Tracebacks" in browser.contents True
最后,我们删除所有错误
>>> browser.open(logbook_url) >>> browser.getControl(name="form.button.deleteall").click() >>> 'Congratulations, there are 0 Errors in your Plone Site!' in browser.contents True
技术细节
本节概述了collective.logbook的工作原理。
站点错误日志补丁
collective.logbook修补了Products.SiteErrorLog.SiteErrorLog的引发方法
from Products.SiteErrorLog.SiteErrorLog import SiteErrorLog _raising = SiteErrorLog.raising def raising(self, info): enty_url = _raising(self, info) notify(ErrorRaisedEvent(self, enty_url)) return enty_url
在返回entry_url之前,补丁会触发一个ErrorRaisedEvent事件。entry_url是标准站点错误日志的链接
https://127.0.0.1:8080/Plone/error_log/showEntry?id=1237283091.10.529903983894
只有当您通过portal_quickinstaller工具安装collective.logbook时,补丁才会安装,当您卸载它时,补丁才会被移除。
您也可以通过Plone控制面板的日志簿配置小部件禁用补丁。
日志存储
默认存储是在Plone站点根目录上的注释存储
<!-- default storage adapter --> <adapter for="*" factory=".storage.LogBookStorage" />
默认存储适配器在您的门户中创建了2个PersistentDict对象。一个是“主要”存储,另一个是“索引”存储,用于跟踪引用的错误。
将通过适配器查找来检索存储。所以越具体的适配器将获胜。也许这里可以使用带有SQLAlchemy的SQL存储:)
通知事件
当发生新的唯一错误时,会触发一个INotifyTraceback事件。collective.logbook已经注册了一个电子邮件事件处理器
<subscriber for=".interfaces.INotifyTraceback" handler=".events.mailHandler" />
此处理器将向在Plone控制面板的日志簿配置小部件中指定的电子邮件地址列表发送新的回溯
配置
collective.logbook现在使用Plone 5的注册表来存储其配置。它有3个配置键
logbook.logbook_log_mails
logbook.logbook_large_site
logbook.logbook_webhook_urls
这些属性包含您在Plone控制面板的日志簿配置小部件中输入的值。
第一个用于将新的回溯电子邮件发送到这些电子邮件地址。
第二个会改变大型站点的一些行为。
第三个会在发生错误时向一些URL进行HTTP POST操作。
变更日志
1.0.0 (2020-04-29)
修复电子邮件以HTML格式生成,但以纯文本格式发送 [ramonski]
清洁安装/卸载 [rafaelbco]
代码清理 [rafaelbco]
Python 3兼容性 [ramonski]
更新构建系统并修复TravisCI [ramonski]
修复#19:在访问视图的方法时发生错误时无法处理回溯 [rafaelbco]
0.9.1 (2018-07-17)
通过确保日志条目的上下文不是acquisition-wrapped来修复#17 [rafaelbco]
0.9.0 (2017-02-23)
通过添加升级步骤来创建注册记录来修复#11 [rafaelbco]
修复#12:尝试登录ZMI时的错误 [rafaelbco]
0.8 (2017-01-27)
为Plone 4/5兼容性进行完整的代码重构、清理和重构 [ramonski]
添加Plone 5.0 pypi分类器,更新README.rst以提及Plone 5兼容性 [tkimnguyen]
0.8b2 (2016-10-24)
为Plone 5版本进行清理/文档更新 [glemignot]
0.8b1 (2016-10-21)
初始移植到Plone 5 [glemignot]
0.7 (2014-06-12)
修复测试 [ramonski]
添加Plone4.3兼容性。 [WouterVH]
添加Web Hook支持 [miohtama, sevanteri]
0.6 (2011-11-28)
在异常处理程序中记录异常 [jfroche]
移动删除所有按钮,添加显示所有按钮,如果未找到错误,则显示错误消息。 [jfroche]
添加禁用浏览已存储错误选项。如果您的网站存在许多错误,此选项将非常有用。[jfroche]
0.5 (2011-08-16)
将存储移动到OOBTree以避免错误事务日志越来越大。相应地添加升级处理程序。[gotcha]
修复了保存配置的问题。[gotcha]
启动时日志初始化至少在Zope 2.13中存在问题。[gotcha]
增加了对i18n的支持。[macagua]
增加了对西班牙语翻译的支持。[macagua]
将邮件通知器移动到视图中,以使用模板更好地处理HTML电子邮件。[rossp]
包含REQUEST HTML,以便进行更有用的调试和故障排除。[rossp]
0.4 (2010-08-02)
添加“z3c.autoinclude.plugin”入口点,因此您可以在Plone 3.3+中避免加载ZCML文件。[WouterVH]
将发送邮件异常公开到日志消息中,这修复了 http://plone.org/products/collective.logbook/issues/3 [naro]
修复了由于MailHost.send签名更改而导致的plone4邮件通知问题(请参阅 升级信息)[fRiSi]
存储并显示引用错误的用户和日期,这修复了 http://plone.org/products/collective.logbook/issues/2 [fRiSi]
0.3.1 (2009-03-18)
错误处理程序现在在将其保存到日志簿之前启动一个新的事务。[ramonski]
0.3 (2009-03-17)
0.2版本存在问题,对此我们表示歉意,现在重新发布。[ramonski]
修复了导致一些丑陋的数据库冲突错误的问题。[ramonski]
移除了所有Zope2.app()相关内容。[ramonski]
当未指定电子邮件时,邮件处理程序停止。[ramonski]
修复了属性的卸载方法。[ramonski]
0.2 (2009-03-17)
为Plone控制面板添加了一个配置小工具。[ramonski]
添加了一个默认的跟踪堆栈跟踪电子邮件处理程序。[ramonski]
为SiteErrorLog补丁添加了属性的安装/卸载方法。[ramonski]
在应用程序根目录中添加了2个属性。[ramonski]
0.1 - 未发布
初始发布。[ramonski]
项目详情
collective.logbook-1.0.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7eb2bf2d02b428f48c389c9a4d154b87e4f8edbd6fbba3a60c80a62d70556443 |
|
MD5 | 7f4a1892147bd62e4d606c6fc0ac4421 |
|
BLAKE2b-256 | 46d05cc8795e51cd9fa788e1b492066f0d5d0742fff985c96805514facbae21b |