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

How to set the same logging format for all handlers?

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

是否可以设置全局默认格式?

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

另一个问题提到的是格式是什么,而不是如何设置它。


目的是在创建格式化程序时将其附加到每个处理程序。

因为您应该在主程序开始时的一个中心位置设置日志目的地,所以这不是很繁重的工作。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 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
# ####################################################

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

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

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

    这可能是一种过度杀戮。


如果您有许多处理程序,建议您使用logging.config.dictConfig()API配置日志记录。另一个答案显示了如何为处理程序配置格式化程序;您可能能够根据需要对其进行调整。