如何装饰Python中的控制台日志消息?
我在用Python写日志,想让控制台显示一些带颜色的消息(不是所有的消息)。
现在我这样做:
print('\033[0;41;97m')
logger.info('Colored message')
print('\033[0m')
这样可以正常工作,但问题是消息上面和下面都有空行。我不能这样做:
print('\033[0;41;97m', end='')
logger.info('Colored message')
print('\033[0m')
因为这样的话,消息下面会有一个空行。而我也不能这样做:
logger.info('\033[0;41;97m' + 'Colored message' + '\033[0m')
因为这样的话,当我打开日志文件时,会看到一些奇怪的符号。有没有什么解决办法呢?
编辑
ch = logging.StreamHandler()
fh = logging.handlers.RotatingFileHandler(log_file, 'a', max_bytes, 10)
ch_formatter = logging.Formatter('%(asctime)s - %(levelname)-4s - '
'%(message)s',
datefmt='%Y.%m.%d_%H:%M:%S_%Z')
fh_formatter = logging.Formatter('%(asctime)s - %(levelname)-4s - '
'%(message)s',
datefmt='%Y.%m.%d_%H:%M:%S_%Z')
ch.setFormatter(ch_formatter)
fh.setFormatter(fh_formatter)
logger.addHandler(ch)
logger.addHandler(fh)
1 个回答
4
更新
原作者提到我正在使用 RotatingFileHandler。:)
定义一个新的 FileHandler
,它可以处理 ansi color
的转义。
# file handler for **ansi_escape**
class MyFileHandler(logging.handlers.RotatingFileHandler):
import re
ansi_escape = re.compile(r'\x1b[^m]*m')
def emit(self, record):
record.msg = self.ansi_escape.sub('', record.msg)
logging.handlers.RotatingFileHandler.emit(self, record)
然后把这个和 StreamHandler
加到 logger
里。
ch = logging.StreamHandler()
fh = MyFileHandler('file.log')
ch_formatter = logging.Formatter('%(asctime)s - %(levelname)-4s - '
'%(message)s',
datefmt='%Y.%m.%d_%H:%M:%S_%Z')
fh_formatter = logging.Formatter('%(asctime)s - %(levelname)-4s - '
'%(message)s',
datefmt='%Y.%m.%d_%H:%M:%S_%Z')
ch.setFormatter(ch_formatter)
fh.setFormatter(fh_formatter)
logger.addHandler(ch)
logger.addHandler(fh)
定义 infoc
... 具体内容见下面:
logger.infoc = lambda msg: logger.info('\033[0;41;97m' + msg + '\033[0m')
最后你可以归档...
# for colored console but not file
logger.infoc('Colored message')
# for normal
logger.info('Normal message')
编辑
那用 wrapper
来处理 彩色信息怎么样。
logger.infoc = lambda msg: logger.info('\033[0;41;97m' + msg + '\033[0m')
logger.infoc('Colored message')
使用 basicConfig
如下:
fmt = '\033[0;41;97m %(message)s \033[0m'
logging.basicConfig(level=logging.DEBUG, format=fmt)
logger = logging.getLogger(__file__)
logger.info('hello')
或者
console = logging.StreamHandler()
console.setFormatter(logging.Formatter(fmt))
logger.addHandler(console)
logger.error('hello')
更新
颜色代码应该只在 StreamHandler
中。把 FileHandler
修改成这样:
fileh = logging.FileHandler('file.log')
fileh.setFormatter(logging.Formatter('%(message)s')) # remove the color code.
logger.addHandler(fileh)
这样你的日志文件里就不会有奇怪的符号了。