strptime: "parse" (解析) → 从字符串解析出时间,字符串 → 时间对象。
strftime: "format" (格式化) → 将时间格式化为字符串,时间对象 → 字符串。
1、时间解析与格式化
在日志分析中,时间字段通常是一个字符串格式(如 22/Nov/2024:10:00:00)。为了对时间字段进行操作,需要将其转换为 datetime 对象。Python 提供了强大的 datetime 模块,可以轻松完成时间的解析与格式化。
平常比较熟悉的时间格式:年-月-日 小时:分钟:秒
2、时间解析
- 使用
datetime.strptime()方法解析时间字符串。 - 格式化字符串用于定义时间字段的格式。
案例:
from datetime import datetime
# 示例时间字符串
time_str = "22/Nov/2024:10:00:00"
# 解析时间字符串为 datetime 对象
log_time = datetime.strptime(time_str, "%d/%b/%Y:%H:%M:%S")
# 输出解析后的 datetime 对象
print("解析后的时间:", log_time)
说明:
from datetime import datetime
from 模块 import 函数
from 模块 import class类(里面有很多函数,调用函数,需要通过这个类)
解析后的时间: 2024-11-22 10:00:00
3、时间格式化
- 使用
datetime.strftime()方法将时间对象转换为特定格式的字符串。 - 可用于生成自定义的时间输出格式。
案例:
# 将 datetime 对象转换为字符串
formatted_time = log_time.strftime("%Y-%m-%d %H:%M:%S")
print("格式化后的时间:", formatted_time)
格式化后的时间: 2024-11-22 10:00:00
4、时间范围比较(重点)
在日志分析中,经常需要筛选某个时间范围内的日志记录。通过比较两个 datetime 对象,可以轻松实现时间范围过滤。
☆ 时间范围比较
- 使用 >=
和<= 运算符比较时间对象。 - 筛选出在指定时间范围内的日志记录。
案例:
# 定义时间范围
start_time = datetime.strptime("22/Nov/2024:10:00:00", "%d/%b/%Y:%H:%M:%S")
end_time = datetime.strptime("22/Nov/2024:10:10:00", "%d/%b/%Y:%H:%M:%S")
# 示例日志时间
log_time = datetime.strptime("22/Nov/2024:10:05:00", "%d/%b/%Y:%H:%M:%S")
# 检查日志时间是否在范围内
if start_time <= log_time <= end_time:
print("日志时间在范围内")
else:
print("日志时间不在范围内")
注意:Python 2.6及以后的版本提供了基本的日期时间处理能力(如字符串时间格式比较,但是要求格式必须完全一致,否则无法比较),但对于复杂的日期和时间操作,使用datetime模块会更为方便和强大。
☆ 时间范围过滤Nginx日志功能(重点)
案例:2025-01-15 02:00:00 ~ 06:00:00发现Nginx服务异常,先需要我们从Nginx的access.log访问日志中提取这段时间的日志信息,使用Python实现!
实现思路:

具体代码实现:
from datetime import datetime
# 读取日志文件并按时间范围筛选
def filter_logs_by_time(log_file, start_time, end_time):
results = []
with open(log_file, "r") as file:
for line in file:
parts = line.split()
# 提取日志时间字段并解析为 datetime 对象
log_time = datetime.strptime(parts[3][1:], "%d/%b/%Y:%H:%M:%S")
# 检查时间是否在范围内
if start_time <= log_time <= end_time:
results.append(line.strip())
return results
# 示例使用
if __name__ == "__main__":
# 定义时间范围
start_time = datetime.strptime("22/Nov/2024:10:00:00", "%d/%b/%Y:%H:%M:%S")
end_time = datetime.strptime("22/Nov/2024:10:10:00", "%d/%b/%Y:%H:%M:%S")
# 日志文件路径
log_file = "nginx_access.log"
# 筛选日志
filtered_logs = filter_logs_by_time(log_file, start_time, end_time)
print("指定时间范围内的日志记录:")
for log in filtered_logs:
print(log)