如何在CherryPy中使用自定义日志记录?

时间:2014-01-17 16:43:57

标签: python cherrypy

(在我的代码修改后稍微改写一下,加上到目前为止给出的答案。感谢Andrew的示例代码,它给了我演示自定义错误记录工作的起点,然后我如何打破它!)

我正在尝试使用CherryPy进行自定义日志记录。我也希望有日志文件轮换,所以我按照文档中的说明更换了日志处理程序。

script_dir在我的代码中早先设置为运行脚本的目录。

cherrypy.config.update({'server.socket_host': '0.0.0.0',
                        'server.socket_port': 1234,
                        'tools.staticdir.on': True,
                        'tools.staticdir.dir': script_dir,
                        'log.access_file': "access1.log",
                        'log.error_file': "error1.log",
                        'log.screen': False,
                        'tools.sessions.on': True,
                       })

config = {'/':
             {
                  'tools.staticdir.on': True,
                  'tools.staticdir.dir': script_dir,
                  'log.access_file': "access2.log",
                  'log.error_file': "error2.log",
                  'log.screen': False,
                  'tools.sessions.on': True,
             }
         }

application = cherrypy.tree.mount(MyApp(), "/", config)

log = application.log

# Make a new RotatingFileHandler for the error log.
fname = getattr(log, "rot_error_file", "error.log")
h = handlers.TimedRotatingFileHandler(fname, when='midnight')
h.setLevel(logging.DEBUG)
h.setFormatter(_cplogging.logfmt)
log.error_file = ""
log.error_log.addHandler(h)

# Make a new RotatingFileHandler for the access log.
fname = getattr(log, "rot_access_file", "access.log")
h = handlers.TimedRotatingFileHandler(fname, when='midnight')
h.setLevel(logging.DEBUG)
h.setFormatter(_cplogging.logfmt)
log.access_file = ""
log.access_log.addHandler(h)

在脚本运行的情况下,日志记录如下:

  • 标准访问日志记录转到BOTH access1.log(在全局级别定义)和access.log(在应用级别定义)
  • 错误记录仅发送到error1.log(在全局级别定义)
  • 没有任何内容记录到* 2.log(按预期方式)

因此,看起来CherryPy在将错误日志记录转到特定于应用程序的配置时出现问题。通常这不会让我担心,除了我确实想要使用旋转日志文件处理程序,但我不知道如何修改全局级别的日志记录会话,就像我为特定于应用程序的级别所做的那样。

感谢。

2 个答案:

答案 0 :(得分: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()

这将记录错误。我相信在您的代码中加载配置会出现问题。我也认为需要转动静态目标。

希望这有助于和快乐编码!

答案 1 :(得分:0)

要回答有关如何为全局日志而不是应用级日志设置日志处理程序的问题,以下是更改:

cherrypy.config.update({'server.socket_host': '0.0.0.0',
                        'server.socket_port': 1234,
                        'tools.staticdir.on': True,
                        'tools.staticdir.dir': script_dir,
                        'log.access_file': "access1.log",
                        'log.error_file': "error1.log",
                        'log.screen': True,
                        'tools.sessions.on': True,
                       })

config = {'/':
             {
             }
         }

application = cherrypy.tree.mount(HealthCheck(script_dir, service_fqdn, my_ip), "/", config)

logscope = cherrypy.log

# Make a new RotatingFileHandler for the error log.
fname = getattr(logscope, "rot_error_file", "error.log")
h = handlers.TimedRotatingFileHandler(fname, when='midnight')
h.setLevel(logging.DEBUG)
h.setFormatter(_cplogging.logfmt)
logscope.error_file = ""
logscope.error_log.addHandler(h)

# Make a new RotatingFileHandler for the access log.
fname = getattr(logscope, "rot_access_file", "access.log")
h = handlers.TimedRotatingFileHandler(fname, when='midnight')
h.setLevel(logging.DEBUG)
h.setFormatter(_cplogging.logfmt)
logscope.access_file = ""
logscope.access_log.addHandler(h)

或简而言之:

  • 将应用程序配置保留为空。我只是定义它,以便CherryPy安静地开始。
  • 将日志范围从application.log更改为cherrypy.log

要稍微整洁一点,对access1.log和error1.log的引用可以更改为access.log和error.log,但我这样做是为了确认我是否覆盖了全局设置。