[Zope] Getting Zope code to output to event.log

Ken Winter ken at sunward.org
Wed Aug 5 16:54:12 EDT 2009



> -----Original Message-----
> From: Andrew Milton [mailto:akm at theinternet.com.au]
> Sent: Wednesday, August 05, 2009 3:49 PM
> To: Ken Winter
> Cc: 'Zope List'
> Subject: Re: [Zope] Getting Zope code to output to event.log
> 
> +-------[ Ken Winter ]----------------------
> | To debug my code in my Zope/Plone site, I sometimes need to put logger
> lines
> | into Zope/Plone code, in order to trace my way through an error
> traceback.
> |
> |
> |
> | I can do this easily with Plone code in the Plone Products folder: Just
> put in
> | the logger line, restart Zope, run my tests, and the output appears in
> the Zope
> | event.log.  But when I try the same thing with native Zope code (for
> example,
> | in the OFS directory), the output doesn?t show up in event.log.
> |
> |
> |
> | I figure these modules have to be reinstalled or re-somethinged to get
> my
> | changes activated, but I don?t know how to do this.  Can you help?
> 
> [this assumes the code is actually being called]
> 
> You are probably logging at a level below the level that will be output
> into the log.
> 
> LOG.info() is about the lowest level that will go out by default.
> 
> Without seeing any examples from you it's hard to tell.

Here's an example of the traceback from the error I'm trying to debug.  I
assume the fact that a module appears in the traceback proves that it is
being called.

2009-08-05T15:11:20 ERROR Zope.SiteErrorLog
http://instance3.dhat.webfactional.com/groups/Popper
Traceback (innermost last):
  Module ZPublisher.Publish, line 115, in publish
  Module ZPublisher.mapply, line 88, in mapply
  Module ZPublisher.Publish, line 41, in call_object
  Module Shared.DC.Scripts.Bindings, line 311, in __call__
  Module Shared.DC.Scripts.Bindings, line 348, in _bindAndExec
  Module Products.PythonScripts.PythonScript, line 326, in _exec
  Module None, line 19, in Popper
   - <PythonScript at /groups/Popper>
   - Line 19
  Module Products.Groups.standard_tree, line 131, in populateStandardTrees
  Module Products.Groups.standard_tree, line 189, in populateStandardTree
  Module Products.CMFCore.PortalFolder, line 414, in invokeFactory
  Module Products.CMFCore.TypesTool, line 937, in constructContent
  Module Products.CMFCore.TypesTool, line 345, in constructInstance
  Module Products.CMFCore.TypesTool, line 359, in _finishConstruction
  Module Products.CMFCore.CMFCatalogAware, line 145, in
notifyWorkflowCreated
  Module Products.CMFCore.WorkflowTool, line 409, in notifyCreated
  Module Products.CMFCore.WorkflowTool, line 760, in
_reindexWorkflowVariables
  Module Products.Archetypes.CatalogMultiplex, line 108, in
reindexObjectSecurity
  Module Products.ZCatalog.CatalogBrains, line 52, in _unrestrictedGetObject
  Module OFS.Traversable, line 187, in unrestrictedTraverse
   - __traceback_info__: (['event', 'base-events'], 'practical-matters')
  Module Products.Five.traversable, line 143, in __bobo_traverse__
AttributeError: practical-matters

Here's a snippet from the unrestrictedTraverse() method of
instance3/Zope-2.9.8-final/lib/python/OFS/Traversable.py:

...
        try:
            obj = self
            while path:
                name = path_pop()
                logger.info("unrestrictedTraverse(): "
                    "\n\t path = %r\n\t name = %r" % (path, name))
                __traceback_info__ = path, name

                if name[0] == '_':
                    # Never allowed in a URL.
                    raise NotFound, name

                if name == '..':
                    next = aq_parent(obj)
                    if next is not _none:
                        if restricted and not securityManager.validate(
                            obj, obj,name, next):
                            raise Unauthorized, name
                        obj = next
                        continue

                bobo_traverse = _getattr(obj, '__bobo_traverse__', _none)
                logger.info("unrestrictedTraverse(): before bobo_traverse")
                if bobo_traverse is not _none:
...

The only thing I've changed in this snippet is to add the two logger lines.
I also had to add these lines at the top of the Traversable.py module:

import logging
logger = logging.getLogger('OFS/Traversable.py:')

~ HTH
~ Ken



More information about the Zope mailing list