How to set the same logging format for all handlers?
我使用
是否可以设置全局默认格式?
或者-是否可以迭代已经通过
另一个问题提到的是格式是什么,而不是如何设置它。
目的是在创建格式化程序时将其附加到每个处理程序。
因为您应该在主程序开始时的一个中心位置设置日志目的地,所以这不是很繁重的工作。
例如,这是我在脚本中使用的要自动运行的库存日志设置代码:
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子类化/添加到所需类中。
这可能是一种过度杀戮。
- 替换
如果您有许多处理程序,建议您使用