Python日志时区配置问题:如何将服务器日志时间改为GMT时区
让Python日志输出GMT时间的两种实现方式
方法一:直接修改Formatter的时间转换函数
你试的方法一其实是可行的,只需要在初始化日志配置之前设置logging.Formatter.converter为time.gmtime,这样所有默认创建的Formatter都会用GMT时间生成%(asctime)s。
完整代码示例:
import logging from logging.handlers import RotatingFileHandler import time # 先设置转换器为GMT时间 logging.Formatter.converter = time.gmtime logging.basicConfig( handlers=[RotatingFileHandler(f"{file_loc}\\{logfile_nme}", maxBytes=500000, backupCount=1)], level=logging.INFO, format='%(asctime)s %(levelname)s %(message)s', datefmt='%d/%m/%Y %H:%M:%S' )
这样生成的%(asctime)s就是GMT时间了。
方法二:自定义Formatter并应用
你写的自定义formatTime方法需要放在一个继承自logging.Formatter的子类里,然后把这个自定义Formatter绑定到你的RotatingFileHandler上,而不是依赖basicConfig的默认配置。
完整实现代码:
import logging from logging.handlers import RotatingFileHandler import time # 自定义Formatter类,重写formatTime方法 class GMTLocalFormatter(logging.Formatter): def formatTime(self, record, datefmt=None): ct_local = time.localtime(record.created) ct_gmt = time.gmtime(record.created) if datefmt: s = time.strftime(datefmt, ct_local) + '\t[' + time.strftime(datefmt, ct_gmt) + ']' else: t_local = time.strftime(self.default_time_format, ct_local) t_gmt = time.strftime(self.default_time_format, ct_gmt) s = self.default_msec_format % (t_local, record.msecs) + '\t[' + self.default_msec_format % (t_gmt, record.msecs) + ']' return s # 手动创建日志处理器和格式化器 handler = RotatingFileHandler(f"{file_loc}\\{logfile_nme}", maxBytes=500000, backupCount=1) formatter = GMTLocalFormatter( fmt='%(asctime)s %(levelname)s %(message)s', datefmt='%d/%m/%Y %H:%M:%S' ) handler.setFormatter(formatter) # 获取根日志器并添加处理器 logger = logging.getLogger() logger.setLevel(logging.INFO) logger.addHandler(handler)
这样日志里会同时显示服务器本地时间和GMT时间,格式和你自定义的一致。
注意点
- 如果用
basicConfig,它会在第一次调用日志方法时创建默认的Handler和Formatter,所以要确保修改logging.Formatter.converter的代码在basicConfig之前执行。 - 自定义Formatter时,建议手动创建Handler和Logger,这样能更灵活控制日志配置,避免
basicConfig的自动初始化限制。
内容的提问来源于stack exchange,提问作者Lifesigns
相关产品推荐
相关产品推荐

