You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中处理防火墙日志:生成时间间隔向量并统计源目地址对峰值

嘿,我来帮你搞定这份防火墙日志的分析需求,用Python结合pandas来实现会非常高效,咱们一步步拆解来做:

1. 数据加载与时间字段预处理

首先得把日志文件读进来,统一处理时间字段——你的日志里有date、hour和Date.Time,优先用Date.Time生成标准的datetime类型,这样后续时间操作更方便。

import pandas as pd

# 读取日志文件(假设是制表符分隔,根据实际格式调整sep参数)
df = pd.read_csv('firewall_logs.csv', sep='\t')

# 把Date.Time转换成datetime类型,处理无效值
df['datetime'] = pd.to_datetime(df['Date.Time'], errors='coerce')

# 筛选2018-01-01到2018-05-06的日志(包含当天最后一刻)
time_mask = (df['datetime'] >= '2018-01-01') & (df['datetime'] <= '2018-05-06 23:59:59')
filtered_df = df[time_mask].dropna(subset=['datetime'])
2. 创建指定间隔的时间向量

你需要的是1分钟间隔和60分钟(1小时)间隔的连续时间序列,覆盖目标时间段的所有时间点,用pd.date_range就能轻松生成:

# 1分钟间隔的时间向量(结束设为05-07是为了包含05-06最后一分钟)
minutely_time_vec = pd.date_range(start='2018-01-01', end='2018-05-07', freq='1T')

# 60分钟间隔的时间向量
hourly_time_vec = pd.date_range(start='2018-01-01', end='2018-05-07', freq='60T')

小提示:如果你的需求是“24小时周期的时间向量”(比如每天固定的00:00-23:59间隔序列),可以先生成单天的时间序列,再根据目标日期范围重复即可,不过从描述来看,连续覆盖整个时间段的向量更符合需求。

3. 按时间间隔统计地址对出现次数

接下来要统计每个时间间隔内,src_address和dest_address地址对的出现次数。我们把datetime设为索引,用resample按时间间隔分组统计:

3.1 1分钟间隔统计

# 设置datetime为索引
filtered_df = filtered_df.set_index('datetime')

# 按1分钟间隔,统计每个地址对的出现次数
minutely_stats = filtered_df.resample('1T').apply(
    lambda x: x.groupby(['src_address', 'dest_address']).size()
)

3.2 1小时间隔统计

hourly_stats = filtered_df.resample('60T').apply(
    lambda x: x.groupby(['src_address', 'dest_address']).size()
)
4. 计算每对地址的最大出现次数

最后,对每个地址对,找出它在所有时间间隔里的最大出现次数:

# 针对1分钟间隔的统计结果求最大值
minutely_max = minutely_stats.groupby(['src_address', 'dest_address']).max()

# 针对1小时间隔的统计结果求最大值
hourly_max = hourly_stats.groupby(['src_address', 'dest_address']).max()

# 合并两种间隔的最大值结果(可选)
max_counts = pd.concat(
    [minutely_max.rename('max_minutely_count'), hourly_max.rename('max_hourly_count')],
    axis=1
)
print(max_counts.head())

如果你的日志是纯文本格式(不是csv),可以先用正则表达式提取字段,再转成DataFrame:

import re

# 匹配日志字段的正则表达式(根据你的日志格式调整)
log_pattern = r'(\d{4}) (\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}) (\d+\.\d+\.\d+\.\d+) (\d+\.\d+\.\d+\.\d+) (\d{4}-\d+)'

# 读取日志文本
with open('firewall_logs.txt', 'r') as f:
    lines = f.readlines()

# 逐行提取字段
data = []
for line in lines[1:]:  # 跳过表头行
    match = re.match(log_pattern, line.strip())
    if match:
        data.append({
            'date': match.group(2),
            'hour': match.group(3).split(':')[0],
            'src_address': match.group(4),
            'dest_address': match.group(5),
            'Date.Time': f"{match.group(2)} {match.group(3)}"
        })

df = pd.DataFrame(data)

这样整个流程就完成了,你可以根据自己的日志格式调整细节~

内容的提问来源于stack exchange,提问作者Hüseyin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:40:39