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

问题描述

在Flask应用程序中,我使用RotatingFileLogger将werkzeug访问日志记录到this question中所示的文件中:

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)

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 -

我要删除日志文件中的颜色代码,例如[37m

werkzeug documentation指出:

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

单击是Flask依赖项,因此无法将其卸载。如何禁用彩色日志?

解决方法

好的,所以您要击中的是

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)

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

不容易防止这种行为。第二个选项是从消息中删除颜色代码。我会尝试使用log Filter更新消息,例如

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)

上面的建议是受以下答案https://stackoverflow.com/a/60692906/4183498启发的。

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

,

我采用了我认为更直接的解决方案,即简单地丢弃所有样式参数 - 在您的应用程序启动中类似这样


    old_color = click.style

    def new_color(text,fg=None,bg=None,bold=None,dim=None,underline=None,blink=None,reverse=None,reset=True):
        return old_color(text)

    # replace flask styling with non-colorized styling
    click.style = new_color
,

这与@jhodges 的想法类似,但更简单 - 它只是完全删除了所有“点击”模块的样式。

import click
click.style = lambda text,*args,**kwargs: text

我的用例是一个 Flask 应用程序,我希望能够将 FileHandler 附加到 werkzeug 的默认记录器,而不会在整个日志文件中散布 ANSI 转义序列。在调用 app.run() 之前放置此代码解决了问题。