问题描述
在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 -
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)
不容易防止这种行为。第二个选项是从消息中删除颜色代码。我会尝试使用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() 之前放置此代码解决了问题。