werkzeug:登录到文件时禁用 bash 颜色

Suz*_*ana 6 python logging werkzeug flask python-3.x

在 Flask 应用程序中,我使用 aRotatingFileLogger将 werkzeug 访问日志记录到文件中,如本问题所示:

file_handler_access_log = RotatingFileHandler("access.log",
                                              backupCount=5,
                                              encoding='utf-8')
formatter = logging.Formatter('%(asctime)s %(module)s %(levelname)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
file_handler_access_log.setFormatter(formatter)
werkzeug_logger.addHandler(file_handler_access_log)
werkzeug_logger.setLevel(logging.DEBUG)
Run Code Online (Sandbox Code Playgroud)

在该access.log文件中,请求如下所示:

2020-10-07 09:43:51 _internal INFO: 127.0.0.1 - - [07/Oct/2020 09:43:51] "[37mGET /api/foo HTTP/1.1[0m" 200 -
Run Code Online (Sandbox Code Playgroud)

我想摆脱[37m日志文件中的颜色代码。

werkzeug文档指出:

开发服务器可以根据状态代码选择以不同颜色突出显示请求日志。安装 单击以启用此功能。

Click 是 Fl​​ask 依赖项,所以我无法卸载它。如何禁用彩色日志记录?

Duš*_*ďar 3

好的,所以你要打的是

if click:
    color = click.style

    if code[0] == "1":  # 1xx - Informational
        msg = color(msg, bold=True)
    ...
self.log("info", '"%s" %s %s', msg, code, size)
Run Code Online (Sandbox Code Playgroud)

来源: https: //github.com/pallets/werkzeug/blob/ef545f0d0bf28cbad02066b4cb7471bea50a93ee/src/werkzeug/serving.py

阻止这种行为并不容易。第二个选项是从消息中删除颜色代码。我会尝试使用日志过滤器来更新消息,例如

import logging

import click
    

class RemoveColorFilter(logging.Filter):
    def filter(self, record):
        if record and record.msg and isinstance(record.msg, str):
            record.msg = click.unstyle(record.msg) 
        return True

remove_color_filter = RemoveColorFilter()
file_handler_access_log.addFilter(remove_color_filter)
Run Code Online (Sandbox Code Playgroud)

上述建议受到以下答案的启发:/sf/answers/4248503451/

我没有测试建议的解决方案。