如何使用带有颜色的日志记录(仅在流中)?

时间:2019-04-11 16:53:12

标签: python logging

TL; DR: 如何让流处理程序以彩色打印日志,文件处理程序如何在不使用文字代码字符的情况下记录日志? 只要我仍在使用标准的python库,任何方法对我来说都很好。

-

我一直在寻找如何在流式记录仪上添加颜色。 我也想使用标准的python日志记录库。

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

对我来说很好,问题是我的记录器登录到流并进入文件。文件也将获得转义/颜色字符,如下所示:

  
      
  • [1; 33mWARNING [1; 0m-运行-记录
  •   

代替:

  
      
  • 警告-运行-日志
  •   

我的代码:

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”,则@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语句无法解决我的问题。字符仍在登录文件中。

总而言之,我如何让流处理程序使用彩色来打印日志,而文件处理程序如何在不使用文字代码字符的情况下记录日志?只要我仍在使用标准的python库,任何方法对我来说都很好。

1 个答案:

答案 0 :(得分:0)