如何为所有处理程序设置相同的日志记录格式?

时间:2017-10-03 15:33:03

标签: python python-3.x logging

我正在使用.setFormatter()在每个处理程序上设置相同的logging.Formatter()

有没有办法设置全局默认格式?

或者 - 是否可以通过.addHandler()将处理程序添加到记录器中进行迭代?

Another question提到格式是什么,而不是如何设置

2 个答案:

答案 0 :(得分:3)

预期的方法是在创建格式化程序时将格式化程序附加到每个处理程序。

由于你应该在主程序开头的一个中心位置设置记录目的地,所以这不是那么费力。

E.g。这是我在我的脚本中使用的库存日志设置代码,它将自动运行:

# set up logging #####################################
import sys,logging,logging.handlers,os.path
log_file=os.path.splitext(__file__)[0]+".log"
l = logging.getLogger()
l.setLevel(logging.DEBUG)
f = logging.Formatter('%(asctime)s %(process)d:%(thread)d %(name)s %(levelname)-8s %(message)s')
h=logging.StreamHandler(sys.stdout)
h.setLevel(logging.NOTSET)
h.setFormatter(f)
l.addHandler(h)
h=logging.handlers.RotatingFileHandler(log_file,maxBytes=1024**2,backupCount=1)
h.setLevel(logging.NOTSET)
h.setFormatter(f)
l.addHandler(h)
del h,f
#hook to log unhandled exceptions
def excepthook(type,value,traceback):
    logging.error("Unhandled exception occured",exc_info=(type,value,traceback))
    #Don't need another copy of traceback on stderr
    if old_excepthook!=sys.__excepthook__:
        old_excepthook(type,value,traceback)
old_excepthook = sys.excepthook
sys.excepthook = excepthook
del excepthook,log_file
# ####################################################

其他方法,但每个方法都有缺点:

  • 每个记录器都有一个未记录的<logger>.handlers列表,但它只列出直接连接到该记录器的处理程序。因此,如果您有多个记录器,则需要遍历此列表。
  • 有一个全局未记录的logging._handlerList(对所有处理程序的引用都保留在那里以便在退出时关闭它们)。同样,这是一个实现细节。
  • 最后,您可以通过

    覆盖处理程序的init逻辑
    • 替换__init__和/或子类的Handler方法(会影响使用logging的所有其他方法)或
    • 将/ addin a mixin子类化为必需的类。

    这可能是一种矫枉过正。

答案 1 :(得分:1)

如果您有多个处理程序,建议您使用logging.config.dictConfig() API配置日志记录。这个other answer显示了如何为处理程序配置格式化程序;你可以根据自己的需要调整它。