4 回答
TA贡献1883条经验 获得超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)
阻止这种行为并不容易。第二个选项是从消息中删除颜色代码。我会尝试使用日志过滤器来更新消息,例如
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)
TA贡献1757条经验 获得超7个赞
更简单 - 它只是完全删除所有“click”模块的样式。
import click
click.style = lambda text, *args, **kwargs: text
编辑:最后,我最终使用过滤器从发送到文件处理程序的日志消息中删除转义序列。由于 werkzeug 将转义序列放入日志消息的 args 列表中,因此这些转义序列也需要被删除。这是基本轮廓:
class NoEscape(logging.Filter):
def __init__(self):
self.regex = re.compile(r'(\x9B|\x1B\[)[0-?]*[ -\/]*[@-~]')
def strip_esc(self, s):
try: # string-like
return self.regex.sub('',s)
except: # non-string-like
return s
def filter(self, record: logging.LogRecord) -> int:
record.msg = self.strip_esc(record.msg)
if type(record.args) is tuple:
record.args = tuple(map(self.strip_esc, record.args))
return 1
希望这可以帮助!
TA贡献1829条经验 获得超7个赞
我采用了我认为更简单的解决方案,即简单地丢弃所有样式参数 - 在应用程序启动中类似这样
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
TA贡献1802条经验 获得超5个赞
我自己遇到了这个问题,但是其他答案中提出的过滤器解决方案修改了发出的所有情况的记录,而我只想删除文件处理程序的样式并将其留给控制台处理程序。
我最终进行了子类化Formatter而不是Filter:
import logging
import click
class AntiColorFormatter(logging.Formatter):
def format(self, record: logging.LogRecord) -> str:
return click.unstyle(super().format(record))
然后它适合类似的东西:
logger = logging.getLogger()
FMT = '{asctime} {levelname} {message}'
handler = logging.StreamHandler()
# regular console output gets normal styling
handler.setFormatter(logging.Formatter(FMT, style='{'))
logger.addHandler(handler)
handler = logging.FileHandler('log.log', encoding='utf8')
# file handler gets styling stripped
handler.setFormatter(AntiColorFormatter(FMT, style='{'))
logger.addHandler(handler)
添加回答
举报