我有一个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”文件。
如何将两者分开?
答案 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()
并创建,配置和附加FileHandler
和Formatter
。