我试图通过在快速启动之前将日志级别设置为30来抑制全局和应用程序层access_log输出,但这似乎仅对全局记录器有效。我可以在启动后设置应用程序记录器的日志级别,但是我想在启动之前设置它的日志级别。有人知道如何实现吗?
对于全局access_log,在开始cherrypy之前起作用:
cherrypy.log.access_log.setLevel(30)
但是,apply_id直到cherrypy启动之前才知道,因此我在启动之前先传递了以下配置,但不兑现,并且应用程序层access_log仍具有日志级别20(INFO)
self._srv_thread = Thread(
target=cherrypy.quickstart,
kwargs={
'root' : self.Root(self,
self._authenticator,
self._authorizer),
'script_name' : '',
'config' : {'/': {
'request.dispatch': cherrypy.dispatch.MethodDispatcher(),
'request.show_tracebacks': False,
'tools.trailing_slash.on': False,
'tools.response_headers.on': True,
**'log.access_log.loglevel' : 30, # <-- not honored !!!!!**
},},
},
daemon=True)
self._srv_thread.start()
日志输出:
2020-06-04 23:28:47,189 rpi1 cherrypy.access.1978553616[5651] INFO 192.168.178.187 - - [04/Jun/2020:23:28:47] "GET /master/loggers HTTP/1.1" 200 1205 "" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:76.0) Gecko/20100101 Firefox/76.0"
启动后,我可以进行以下调用以成功更改应用程序层access_log的日志级别:
cherrypy.tree.apps[''].log.access_log.setLevel(30)
如何在cherrypy启动应用程序之前设置两个日志级别?
提前感谢。
我通过在cherrypy启动后设置日志级别来实现解决方法。最初对于应用程序访问记录器来说这都不起作用-似乎在安装/启动应用程序后的某个时间创建了应用程序记录器,因此我添加了一个线程,每秒检查应用程序是否已启动,然后设置日志级别达到所需的水平。如果有人感兴趣,这是类方法代码。对于参数“ logger_name”设置为字符串“ access_log”或“ error_log”的每个记录器(访问记录器和错误记录器),均可调用该方法:
def set_cp_loglevel(self, logger_name, value):
def set_cp_app_ll_run():
sleep(1)
set_cp_app_loglevel()
def set_cp_app_loglevel():
if cherrypy.tree.apps:
l_app = getattr(cherrypy.tree.apps[''].log, logger_name)
l_app.setLevel(value)
debug_log(self, msg + "done.")
else:
debug_log(self, f"waiting for cherrypy to start...")
t = Thread(target=set_cp_app_ll_run, daemon=True)
t.start()
msg = debug_log(self, f"setting {logger_name} loglevel to {value}...")
if not (isinstance(value, int) and value in (10, 20, 30, 40, 50)):
raise ValueError(f"loglevel must be one of these: "
f"{(10, 20, 30, 40, 50)}, got {value}")
l = getattr(cherrypy.log, logger_name)
l.setLevel(value)
set_cp_app_loglevel()
我仍然希望在cherrypy开始之前听到如何正确执行此操作。