CherryPy将上下文信息添加到日志记录中

时间:2015-06-03 13:50:05

标签: python cherrypy

我正在使用CherryPy 3.7.0构建一个小型网络应用。

我的问题是我无法弄清楚如何将上下文信息添加到其日志记录输出中。

即使我已经多次浏览过它的文档,但还不清楚如何实现这样的事情。 我有兴趣在记录器中添加task属性,以便在我的一个视图中我能够写出:

logger.info('Processing finished', extra={'task': 'jashgd-765273-ehdfiuh'})

我该怎么做?

提前致谢

2 个答案:

答案 0 :(得分:3)

阅读文档

以下是logging.debug关于extra关键字参数的文档:

  

第三个可选关键字参数是extra,可用于传递一个字典,该字典用于填充为具有用户定义属性的日志记录事件创建的LogRecord 的__dict__。然后可以根据需要使用这些自定义属性。例如,它们可以合并到记录的消息中。例如:

FORMAT = '%(asctime)-15s %(clientip)s %(user)-8s %(message)s'
logging.basicConfig(format=FORMAT)
d = {'clientip': '192.168.0.1', 'user': 'fbloggs'}
logging.warning('Protocol problem: %s', 'connection reset', extra=d)

即。不会自动记录extra - 您需要提供适当的格式化程序。

这是CherryPy的常规cherrypy._cplogging.LogManager.error,它有效地将数据传递给stdlib的记录器:

def error(self, msg='', context='', severity=logging.INFO, traceback=False):
    """...
    This is not just for errors! Applications may call this at any time
    to log application-specific information.
    ...
    """
    if traceback:
        msg += _cperror.format_exc()
    self.error_log.log(severity, ' '.join((self.time(), context, msg)))

另请查看cherrypy._cplogging的文档字符串。它解释了CherryPy日志记录的预期扩展。

编写代码

从上面的部分我们有后果。简单的答案是您无法直接执行。 @AndrewKloos答案实际上并不是答案,因为您无法按顺序将dict传递给str.join。此外,您甚至无法通过extra关键字参数,因为签名中没有这样的正式参数。即使你可以,给格式化程序额外的占位符也会导致任何CherryPy正常日志记录中的字符串插值错误(显然不能提供任何额外的密钥)。

因此,最好的妥协就是:

cherrypy.log('Processing finished ' + str({'task': 'jashgd-765273-ehdfiuh'}))

其他选择:

  • 除错误和访问日志外,创建自己的记录器
  • 直接调用cherrypy.log.error_log.info
  • Monkeypatch cherrypy.log,您的子类为cherrypy._GlobalLogManager

更新

Introspect Python logging with logging_tree是一篇很好的文章(和包),它解释了CherryPy应用程序示例中的日志记录层次结构和消息传递。

答案 1 :(得分:0)

试试这个......

import cherrypy
from cherrypy import log

class MyApp(object):
    def index(self):
        log.error(msg='This is My Error ', context='HTTP', severity=20, traceback=True)
        return "Hello World!"    
    index.exposed = True

cherrypy.tree.mount(MyApp(), "/")

cherrypy.config.update({'tools.staticdir.on': True,
    'tools.staticdir.dir': 'C:\\Documents and Settings\\d\\My Documents\\Aptana Studio 3 Workspace\\ScratchPad',
    'log.access_file' : "access.log",
    'log.error_file' : "error.log",
    'log.screen' : False,
    'tools.sessions.on': True,
    })


cherrypy.engine.start()
cherrypy.engine.block()

希望这有帮助!