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)
,但我担心,当存在许多日志消息时,这样的正则表达式匹配是否会影响应用程序的性能?