如何使用彩色日志(仅在流中)?

2024-05-12 21:51:41 发布

您现在位置:Python中文网/ 问答频道 /正文

TL;DR: 如何让流处理程序打印带有颜色的日志,而文件处理程序记录它们而不使用文本代码字符? 只要我还在使用standart python库,任何方法都可以。你知道吗

---

我一直在寻找如何添加颜色的记录器时,它的流。 我还想使用standart python日志库。

我找到了这个解决方案:https://stackoverflow.com/a/7995762/11037602

这对我很有帮助,问题是我的记录器登录到流和文件中。文件也会得到转义符/颜色字符,如下所示:

  • [1;33mWARNING[1;0m - run - log

而不是:

  • WARNING - run - log

我的代码:

def setup_logger():
  logger = logging.getLogger()

  #Code suggested in SO question
  logging.addLevelName( logging.WARNING, "\033[1;31m%s\033[1;0m" % logging.getLevelName(logging.WARNING))
  logging.addLevelName( logging.ERROR, "\033[1;41m%s\033[1;0m" % logging.getLevelName(logging.ERROR))

  logger.setLevel(logging.DEBUG) 
  formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(funcName)s - %(message)s')

  fh = logging.FileHandler('file.log')
  fh.setFormatter(formatter)
  logger.addHandler(fh)

  sh = logging.StreamHandler()
  sh.setFormatter(formatter)
  logger.addHandler(sh)

  return logger

正如我所说,这是可行的,但是它也会将字符记录到文件日志中。你知道吗

如果你在我链接的问题上点击“显示2条评论”,user@lesnik建议将答案的代码放在If语句中,我假设他的意思是这样的:

if sys.stderr.isatty():
  logging.addLevelName( logging.WARNING, "\033[1;31m%s\033[1;0m" % logging.getLevelName(logging.WARNING))
  logging.addLevelName( logging.ERROR, "\033[1;41m%s\033[1;0m" % logging.getLevelName(logging.ERROR))

编辑:更正了输入错误(由@Brad Solomon指出),但仅仅添加这个if语句并不能解决我的问题。字符仍记录在文件中。你知道吗

总而言之,如何让流处理程序打印带有颜色的日志,而让文件处理程序记录没有文字代码字符的日志?只要我还在使用standart python库,任何方法都可以。你知道吗


Tags: 文件代码log处理程序颜色formatterlogging记录