【问题标题】:How can I set CherryPy's application access_log level before it starts?如何在 CherryPy 应用程序启动之前设置访问日志级别?
【发布时间】:2020-06-04 22:36:50
【问题描述】:

我试图通过在快速启动之前将 loglevel 设置为 30 来抑制全局和应用层 access_log 输出,但这似乎只适用于全局记录器。我可以在应用程序记录器启动后设置它的日志级别,但我想在它启动之前设置它的日志级别。有谁知道如何做到这一点?

对于全局 access_log,这在启动 cherrypy 之前有效:

cherrypy.log.access_log.setLevel(30)

然而,app_id 在cherrypy 启动之前是未知的,所以我在它启动之前传递了以下配置,但它没有被兑现,并且应用层 access_log 仍然具有 loglevel 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启动应用程序之前设置两个日志级别?

提前致谢。

【问题讨论】:

  • 'log.access_log.on': False 怎么样?

标签: logging cherrypy


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-17
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 2015-11-04
    • 2020-05-11
    相关资源
    最近更新 更多