我试图设置一个记录器,只捕获错误级别的消息,但我的记录器似乎总是将INFO:cherrypy.access消息写入日志文件,而我不想这样做。我尝试设置log.error_file全局,并使用标准的python模块logging.basicConfig(filename='error.log', filemode='w', level=logging.ERROR),但即使我指定了错误级别消息的阈值,我仍然可以将这些信息级别的消息写入日志文件。有什么办法可以防止这种情况发生吗?
发布于 2015-07-29 17:26:05
我可以通过设置自己的访问消息来禁用访问消息:
logging.basicConfig(filename='error.log', filemode='w', level=logging.ERROR)
然后设置:
cherrypy.log.access_log.propagate = False
发布于 2015-07-29 02:25:17
似乎INFO级别的日志将用于cherrypy.access。根据文档的说法-
您应该在全局级别或每个应用程序上设置这些值(请参见下一个),但通常不能同时设置两者。 log.screen:将此设置为True,以便将“error”和“access”消息打印到stdout。log.access_file:将其设置为一个绝对文件名,您希望在其中写入“访问”消息。log.error_file:将其设置为一个绝对文件名,在该文件名中需要写入“错误”消息。
您还应该尝试设置log.access_file (类似于log.error_file)。或者你可以为此添加一个处理程序,例如-
from logging import handlers
fname = getattr(log, "rot_access_file", "access.log") #The log for access messsages.
h = handlers.TimedRotatingFileHandler(fname, when='midnight')
h.setLevel(logging.DEBUG)
h.setFormatter(_cplogging.logfmt)
log.access_file = ""
log.access_log.addHandler(h)发布于 2018-04-25 19:30:34
我也有这个问题,我想明白了。因此,在这里张贴它,并希望它可以帮助人们有类似的问题。
CherryPy 14.2.0版
要禁用access日志记录,只需将空字符串保留为'log.access_file': ''
if __name__ == '__main__':
cherrypy.config.update(
{
'server.socket_host': settings.HOST,
'server.socket_port': settings.PORT,
'log.screen': True,
'log.access_file': '',
'log.error_file': ''
}
)
config = {
'/': {
'tools.sessions.on': True,
'tools.staticdir.on': True,
'tools.staticdir.dir': settings.PROJECT_ROOT
}
}下面我发布了我的自定义日志配置logging_configuration.py,我在设置中添加了自定义记录器:
# logger settings
LOGGER_NAME = 'custom'
_LOGGER_HANDLER = 'cherrypy_' + LOGGER_NAME
_MULTIMEDIA_LOGFILE = LOGGER_NAME + '.log'
_ACCESS_LOGFILE = 'access.log'
_ERRORS_LOGFILE = 'errors.log'
LOG_CONF = {
'version': 1,
'formatters': {
'void': {
'format': ''
},
'standard': {
'format': '%(asctime)s (%(module)15s:%(lineno)2s) [%(levelname)s] %(message)s'
},
},
'handlers': {
_LOGGER_HANDLER: {
'level':'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'formatter': 'standard',
'filename': _MULTIMEDIA_LOGFILE,
'maxBytes': 10485760,
'backupCount': 20,
'encoding': 'utf8'
},
'cherrypy_access': {
'level':'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'formatter': 'void',
'filename': _ACCESS_LOGFILE,
'maxBytes': 10485760,
'backupCount': 20,
'encoding': 'utf8'
},
'cherrypy_error': {
'level':'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'formatter': 'void',
'filename': _ERRORS_LOGFILE,
'maxBytes': 10485760,
'backupCount': 20,
'encoding': 'utf8'
},
},
'loggers': {
LOGGER_NAME: {
'handlers': [_LOGGER_HANDLER],
'level': 'INFO',
'propagate': False
},
'cherrypy.access': {
'handlers': ['cherrypy_access'],
'level': 'INFO',
'propagate': False
},
'cherrypy.error': {
'handlers': ['cherrypy_console', 'cherrypy_error'],
'level': 'INFO',
'propagate': False
},
}
}我是怎么用的?
import cherrypy
from docs import logging_configuration as loggingconf
if __name__ == '__main__':
cherrypy.config.update(
{
'server.socket_host': settings.HOST,
'server.socket_port': settings.PORT,
'log.screen': True,
}
)
cherrypy.engine.unsubscribe('graceful', cherrypy.log.reopen_files)
logging.config.dictConfig(loggingconf.LOG_CONF) # add it here
config = {
'/': {
'tools.sessions.on': True,
'tools.staticdir.on': True,
'tools.staticdir.dir': settings.PROJECT_ROOT
}
}
cherrypy.quickstart(CampPage(), '/', config)要登录到cherrypy_custom.log,请使用:
logger = logging.getLogger(loggingconf.LOGGER_NAME)
logger.info('Hello There...') # this line will be written into cherrypy_custom.log若要禁用访问日志,请将_ACCESS_FILELOG = ''设置为空字符串。
https://stackoverflow.com/questions/31689040
复制相似问题