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

WoJ*_*WoJ 5 python logging python-3.x

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

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

或者 - 是否可以迭代已经通过.addHandler()记录器添加的处理程序?

另一个问题提到了格式是什么,但没有提到如何设置它。

iva*_*eev 4

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

由于您应该在主程序开始时在一个中心位置设置日志记录目标,因此这并不是一件费力的事情。

例如,这是我在要自主运行的脚本中使用的库存记录设置代码:

# 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
# ####################################################
Run Code Online (Sandbox Code Playgroud)

还有其他方法但每种方法都有缺点:

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

    • 替换和/或子类__init__的方法Handler(这将影响使用 的其他所有内容logging),或者通过
    • 子类化/添加 mixin到所需的类中。

    这可能有点矫枉过正了。