如何从Python logging库程序化获取asctime时间戳?
获取logging库中与%(asctime)s一致的时间戳
logging库并没有提供类似getAsctime()的直接方法,但可以通过两种方式生成和%(asctime)s格式完全一致的时间戳:
方法1:利用logging.Formatter生成(推荐,和logging原生逻辑完全对齐)
%(asctime)s的格式是由logging.Formatter处理生成的,因此可以直接实例化Formatter并调用其formatTime方法来获取:
import logging import json # 初始化Formatter,默认格式和%(asctime)s一致 formatter = logging.Formatter() # 创建一个空的LogRecord(仅用于生成时间戳,不影响日志内容) log_record = logging.LogRecord("", logging.INFO, "", 0, "", (), None) # 获取和%(asctime)s完全相同格式的时间戳字符串 asctime_str = formatter.formatTime(log_record) # 将时间戳加入结构化日志 logging.info( json.dumps({ 'my_logger_name': self.my_name, 'log_level': self.log_level, 'message': message, 'some_data': some_data, 'asctime': asctime_str }) )
如果需要自定义时间格式,只需在初始化Formatter时指定格式字符串即可,比如:
formatter = logging.Formatter("%Y-%m-%d %H:%M:%S")
方法2:手动生成匹配格式的时间戳
logging默认的%(asctime)s格式为%Y-%m-%d %H:%M:%S,%f,且会将微秒截断为三位(比如2024-05-20 14:30:00,123)。可以直接用datetime模块生成对应格式的字符串:
from datetime import datetime import json # 生成和logging默认asctime一致的时间戳 asctime_str = datetime.now().strftime("%Y-%m-%d %H:%M:%S,%f")[:-3] # 加入结构化日志 logging.info( json.dumps({ 'my_logger_name': self.my_name, 'log_level': self.log_level, 'message': message, 'some_data': some_data, 'asctime': asctime_str }) )
补充说明
%(asctime)s本质是日志记录被格式化时,由Formatter根据日志记录的created时间戳(即日志事件发生的时间戳,浮点数格式)转换而来的字符串,并非Logger对象的固有属性,因此没有直接的 getter 方法。上面两种方法都能保证生成的时间戳和原生%(asctime)s完全一致。
内容的提问来源于stack exchange,提问作者GrinnS
相关产品推荐
相关产品推荐

