Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从日志消息中生成`FileHandler`带终端转义序列(颜色)?_Python_Python 3.x_Django_Logging_Terminal - Fatal编程技术网

Python 如何从日志消息中生成`FileHandler`带终端转义序列(颜色)?

Python 如何从日志消息中生成`FileHandler`带终端转义序列(颜色)?,python,python-3.x,django,logging,terminal,Python,Python 3.x,Django,Logging,Terminal,我有一个Logger和两个Handlers:StreamHandler和FileHandler 我想通过StreamHandler使用转义序列(请参阅记录器用法)将彩色输出记录到终端。但是,我不想通过文件处理程序记录此类转义序列: Log to StreamHandler: \033[39m{}\033[0m\033[91m{}\033[0m\033[39m{}\033[0m Log to FileHandler: {}{}{} 换句话说,FileHandler应该去掉终端转义序列 除了创建两

我有一个
Logger
和两个
Handler
s:
StreamHandler
FileHandler

我想通过
StreamHandler
使用转义序列(请参阅记录器用法)将彩色输出记录到终端。但是,我不想通过
文件处理程序记录此类转义序列:

Log to StreamHandler: \033[39m{}\033[0m\033[91m{}\033[0m\033[39m{}\033[0m
Log to FileHandler: {}{}{}
换句话说,
FileHandler
应该去掉终端转义序列

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

如果可以避免的话,我真的不想在代码中携带两个独立的
记录器

记录器使用情况

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
记录器配置

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
def init(日志、级别、无控制台):
格式化程序=日志记录。格式化程序(

{asctime:s}--{levelname:但是有一个更好的解决方案。每个处理程序都可以有自己的
格式化程序
。因此理想的方法是只向
StreamHandler
添加一个
格式化程序
,它将终端转义序列添加到日志中。

谢谢。在我的情况下,日志消息包含任意文本,因此很难知道w终端转义符的确切位置。您有解决方案吗?我已决定在
文件处理程序中删除终端转义符:
record.msg=re.sub('\033\[91m(.*)\033\[0m','\\1',record.msg)
,但我担心,当存在许多日志消息时,这样的正则表达式匹配是否会影响应用程序的性能?