Commit 91bcac00 authored by Martijn Pieters's avatar Martijn Pieters

Copy the entry id into the event log as well; this lets you correlate between

eventlog entries and their corresponding entry in the SiteErrorLog. Needed when
a user reports the entry id after seeing an error and the server has since
restarted.
parent 3587f45a
...@@ -269,6 +269,12 @@ Zope Changes ...@@ -269,6 +269,12 @@ Zope Changes
for more time zones and up to date daylight saving time for more time zones and up to date daylight saving time
information. information.
- SiteErrorLog now includes the entry id in the information copied to
the event log. This allowes you to correlate a user error report with
the event log after a restart, or let's you find the REQUEST
information in the SiteErrorLog when looking at a traceback in the
event log.
Bugs Fixed Bugs Fixed
- Specified height/width of icons in ZMI listings so the table doesn't - Specified height/width of icons in ZMI listings so the table doesn't
......
...@@ -216,18 +216,18 @@ class SiteErrorLog (SimpleItem): ...@@ -216,18 +216,18 @@ class SiteErrorLog (SimpleItem):
LOG.error('Error while logging', exc_info=sys.exc_info()) LOG.error('Error while logging', exc_info=sys.exc_info())
else: else:
if self.copy_to_zlog: if self.copy_to_zlog:
self._do_copy_to_zlog(now,strtype,str(url),tb_text) self._do_copy_to_zlog(now,strtype,entry_id,str(url),tb_text)
return '%s/showEntry?id=%s' % (self.absolute_url(), entry_id) return '%s/showEntry?id=%s' % (self.absolute_url(), entry_id)
finally: finally:
info = None info = None
def _do_copy_to_zlog(self,now,strtype,url,tb_text): def _do_copy_to_zlog(self,now,strtype,entry_id,url,tb_text):
when = _rate_restrict_pool.get(strtype,0) when = _rate_restrict_pool.get(strtype,0)
if now>when: if now>when:
next_when = max(when, now-_rate_restrict_burst*_rate_restrict_period) next_when = max(when, now-_rate_restrict_burst*_rate_restrict_period)
next_when += _rate_restrict_period next_when += _rate_restrict_period
_rate_restrict_pool[strtype] = next_when _rate_restrict_pool[strtype] = next_when
LOG.error('%s\n%s' % (url, tb_text.rstrip())) LOG.error('%s %s\n%s' % (entry_id, url, tb_text.rstrip()))
security.declareProtected(use_error_logging, 'getProperties') security.declareProtected(use_error_logging, 'getProperties')
def getProperties(self): def getProperties(self):
......
...@@ -14,6 +14,7 @@ import transaction ...@@ -14,6 +14,7 @@ import transaction
import sys import sys
import unittest import unittest
import logging
class SiteErrorLogTests(unittest.TestCase): class SiteErrorLogTests(unittest.TestCase):
...@@ -27,10 +28,18 @@ class SiteErrorLogTests(unittest.TestCase): ...@@ -27,10 +28,18 @@ class SiteErrorLogTests(unittest.TestCase):
from Products.SiteErrorLog.SiteErrorLog import SiteErrorLog from Products.SiteErrorLog.SiteErrorLog import SiteErrorLog
self.app._setObject('error_log', SiteErrorLog()) self.app._setObject('error_log', SiteErrorLog())
self.app.manage_addDTMLMethod('doc', '') self.app.manage_addDTMLMethod('doc', '')
self.logger = logging.getLogger('Zope.SiteErrorLog')
self.log = logging.handlers.BufferingHandler(sys.maxint)
self.logger.addHandler(self.log)
self.old_level = self.logger.level
self.logger.setLevel(logging.ERROR)
except: except:
self.tearDown() self.tearDown()
def tearDown(self): def tearDown(self):
self.logger.removeHandler(self.log)
self.logger.setLevel(self.old_level)
transaction.abort() transaction.abort()
self.app._p_jar.close() self.app._p_jar.close()
...@@ -121,6 +130,22 @@ class SiteErrorLogTests(unittest.TestCase): ...@@ -121,6 +130,22 @@ class SiteErrorLogTests(unittest.TestCase):
# log entries # log entries
self.assertEquals(len(sel_ob.getLogEntries()), previous_log_length) self.assertEquals(len(sel_ob.getLogEntries()), previous_log_length)
def testEntryID(self):
elog = self.app.error_log
# Create a predictable error
try:
raise AttributeError, "DummyAttribute"
except AttributeError:
info = sys.exc_info()
elog.raising(info)
entries = elog.getLogEntries()
entry_id = entries[0]['id']
self.assertTrue(entry_id in self.log.buffer[-1].msg,
(entry_id, self.log.buffer[-1].msg))
def testCleanup(self): def testCleanup(self):
# Need to make sure that the __error_log__ hook gets cleaned up # Need to make sure that the __error_log__ hook gets cleaned up
self.app._delObject('error_log') self.app._delObject('error_log')
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment