与CherryPy记录器分开记录

时间:2015-01-06 18:26:07

标签: python logging cherrypy

我有一个CherryPy应用程序并启用了日志记录(访问和应用程序文件)。

conf = {'/':
    {
        'tools.staticdir.on': True,
        'tools.staticdir.dir': WEB_ROOT,
        'tools.staticdir.index': 'debug_registers2.html',
        'log.access_file': ACCESS_LOG,
        'log.error_file': APP_LOG,
    }
}

除了默认的CherryPy日志数据,我还使用如下语句:

cherrypy.log("My text here") 

现在我需要创建第3个日志文件,我将其他一些数据传递给。 如果我这样做:

logging.basicConfig(filename=SPI_LOG,level=logging.DEBUG)
logging.debug('This message should go to the SPI log file')

我的CherryPy日志数据也会进入“SPI_LOG”文件。

如何将两者分开?

2 个答案:

答案 0 :(得分:1)

默认情况下,cherrypy具有以下日志记录结构:

  • "cherrypy.error"记录器,拥有它自己的处理程序。
  • "cherrypy.access"记录器,拥有它自己的处理程序。
  • "cherrypy"记录器,即来自前两个记录器的父记录器,并接收他们的日志,但没有任何处理程序关联。

  • 永远存在的"root"记录器,它是来自"cherrypy"记录器的父记录器,没有关联的处理程序。

1)因此,使用此配置,CherryPy会将日志写入错误并访问日志。该日志由各自的处理程序捕获和显示。如果您使用cherrypy.log(),则会从"cherrypy.error"发送日志。

所有日志也最多发送到"cherrypy"然后"root"记录器,但由于没有处理程序,因此无效。

2)之后如果您从应用程序中使用logging.error(),则会为根日志创建一个处理程序,并将日志发送给它。因此,此根处理程序将显示您的日志和樱桃日志。您的日志将出现一次,cherrypy日志将出现两次,一次通过自己的处理程序,然后通过根处理程序,当消息进入它时。你可以看到处理程序是不同的,因为cherrypy处理程序是自定义的(时间戳),自动根处理程序有另一种格式。

3)如果您为应用程序创建了一个记录器并进行了记录,那么

local_logger=logging.getLogger("my logger")

消息不会出现,因为它还没有任何处理程序,然后消息被传递给根记录器(也是"我的记录器"的父级),它没有任何处理程序关联。

4)如果您为应用创建记录器并调用logging.basicConfig(),它将为根记录器创建一个处理程序,您将处于与2)相同的情况

5)最后,如果你为你的应用程序创建一个记录器

local_logger=logging.getLogger("my logger")

然后为它创建一个处理程序

local_logger.addHandler(logging.StreamHandler())

然后你的日志将通过它的处理程序显示,然后发送到root logger,以及已处理的cherrypy日志,但是在这个级别,它们都不会再次显示,因为root logger仍然没有与之关联的处理程序!这就是你想要的。要使用文件而不是控制台输出,只需选择另一类处理程序。

这让我永远想知道所有这些是如何运作的,并且与樱桃双日志和我的未被展示的斗争,以及所有不同的格式和所有!我发现它没有明确解释所以我希望这有帮助!

答案 1 :(得分:0)

不要使用根记录程序(作为CP记录程序的父程序,它也会收到所有消息)。创建一个logging.getLogger('myapp')的孩子。而不是致电basicConfig(),您必须单独setLevel()并创建,配置和附加FileHandlerFormatter