4 回答

TA貢獻(xiàn)1883條經(jīng)驗(yàn) 獲得超3個(gè)贊
好的,所以你要打的是
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)
阻止這種行為并不容易。第二個(gè)選項(xiàng)是從消息中刪除顏色代碼。我會嘗試使用日志過濾器來更新消息,例如
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貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超7個(gè)贊
更簡單 - 它只是完全刪除所有“click”模塊的樣式。
import click
click.style = lambda text, *args, **kwargs: text
編輯:最后,我最終使用過濾器從發(fā)送到文件處理程序的日志消息中刪除轉(zhuǎn)義序列。由于 werkzeug 將轉(zhuǎn)義序列放入日志消息的 args 列表中,因此這些轉(zhuǎn)義序列也需要被刪除。這是基本輪廓:
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貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
我采用了我認(rèn)為更簡單的解決方案,即簡單地丟棄所有樣式參數(shù) - 在應(yīng)用程序啟動中類似這樣
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貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
我自己遇到了這個(gè)問題,但是其他答案中提出的過濾器解決方案修改了發(fā)出的所有情況的記錄,而我只想刪除文件處理程序的樣式并將其留給控制臺處理程序。
我最終進(jìn)行了子類化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)
添加回答
舉報(bào)