【问题标题】:How to make a `FileHandler` strip terminal escape sequences (colors) from a log message?如何使“FileHandler”从日志消息中去除终端转义序列(颜色)?
【发布时间】:2020-12-15 08:31:02
【问题描述】:

我有一个 Logger 和两个 Handlers:StreamHandlerFileHandler

我想通过StreamHandler 使用转义序列将彩色输出记录到终端(请参阅记录器用法)。但是,我不想通过FileHandler 记录这样的转义序列:

Log to StreamHandler: \033[39m{}\033[0m\033[91m{}\033[0m\033[39m{}\033[0m
Log to FileHandler: {}{}{}

换句话说,FileHandler 应该去掉终端转义序列。

除了创建两个分别配置StreamHandlerFileHandlerLoggers 之外,还有什么解决方案吗?

如果可以避免的话,我真的不想在代码中携带两个单独的Loggers。

记录器使用情况

fmt = 'Match: {} ({}/v{}): \033[39m{}\033[0m\033[91m{}\033[0m\033[39m{}\033[0m ({}) {}'

self.logger.info(
    fmt,
    o.type.lower(),
    o.id,
    o.version,
    remove_control_chars(match.left),
    remove_control_chars(match.text),
    remove_control_chars(match.right),
    match.regex,
    suffix
)

记录器配置

def init(log, level, no_console):
    formatter = logging.Formatter(
        '{asctime:s} -- {levelname:<5s} -- {name:s} -- {process:d} -- {funcName:s} -- {message:s}',
        datefmt='%m/%d/%Y %I:%M:%S %p',
        style='{'
    )

    logger = logging.getLogger('watchdog')

    if getattr(logging, level.upper()) is None:
        raise common.exc.WatchdogException(f'Failed to set level for logger: {level.upper()}')

    logger.setLevel(getattr(logging, level.upper()))

    if not no_console:
        handler = logging.StreamHandler()
        handler.setFormatter(formatter)
        logger.addHandler(handler)

    try:
        handler = logging.FileHandler(log, mode='w+')
        handler.setFormatter(formatter)
        logger.addHandler(handler)
    except Exception as exc:
        raise common.exc.WatchdogException(f'Failed to initialize file handler: {log}') from exc

【问题讨论】:

    标签: python python-3.x django logging terminal


    【解决方案1】:

    It is possible to strip the extra characters in the FileHandler by adding a Filter to it 但有更好的解决方案。每个处理程序都可以有自己的Formatter。因此,理想的方法是将Formatter 仅添加到StreamHandler,这会将终端转义序列添加到日志中。

    【讨论】:

    • 谢谢。就我而言,日志消息包含任意文本,因此很难知道终端转义的确切位置。你有解决方案吗?我已经决定在FileHandler:record.msg = re.sub('\033\[91m(.*)\033\[0m', '\\1', record.msg) 中删除终端转义符,但我担心这样的正则表达式匹配是否会影响应用程序的性能,当有很多日志消息时?
    猜你喜欢
    • 2014-09-26
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多