如何在启动前设置CherryPy的应用程序access_log级别?

问题描述 投票:1回答:1

我试图通过在快速启动之前将日志级别设置为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启动应用程序之前设置两个日志级别?

提前感谢。

logging cherrypy
1个回答
0
投票

我通过在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开始之前听到如何正确执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.