介绍
不久前,公司里有人告诉我“我想知道 Apache 的访问日志是否可以用来做一些事情”。
数据分析,Apache,发文章,我是初学者,写的不好请见谅。
访问日志分析
导入模块
我正在使用以下模块。
# データの処理
import pandas as pd
import numpy as np
# グラフ表示
import plotly.express as px
from plotly import tools
import seaborn as sns
import matplotlib.pyplot as plt
# その他
import datetime,time
import ipaddress
加载数据
我阅读了所有日志文件。
col_names = ['ip','c1','c2', 'datetime', 'timezone', 'request', 'status', 'size', 'referer', 'user_agent']
df = pd.read_csv("データのパス", sep=' ', dtype=str, names=col_names)
df[:1]
数据整形
IP版本
由于我们要分离 IPv4 和 IPv6,我们使用 ipaddress 模块将 IP 版本数据添加到新列。
def ipcheck(x):
return ipaddress.ip_address(x.iloc[0]).version
df["ip_ver"] = np.nan
df["ip_ver"] = df.apply(ipcheck, axis=1)
设备信息
虽然是蛮力,但操作系统是由 UserAgent 确定并添加数据。
def device(x):
ua = x.iloc[9]
dev = "etc"
if "iPhone" in ua:
dev="iPhone"
elif "Android" in ua:
dev="Android"
elif "Win" in ua:
dev="Windows"
elif "Mac" in ua:
dev="Macintosh"
elif "Linux" in ua:
dev="Linux"
return dev
df["device"] = np.nan
df["device"] = df.apply(device, axis=1)
日期和时间
由于读取时日期和时区是分开的,因此将其存储为 Python 日期时间类型。
#datetime,timezoneをpythonのdatetime型に変換して挿入
datetime_str = df.datetime + df.timezone
time_trimmed = datetime_str.map(lambda s: s.strip('[]').split('+')[0])
df['datetime'] = pd.to_datetime(time_trimmed, format='%d/%b/%Y:%H:%M:%S')
我们还为热图添加了仅限时间的数据。 (也许我不应该费心添加它......)
def hourcheck(x):
dt = x.iloc[3]
return dt.strftime('%H')
df["hour"] = np.nan
df["hour"] = df.apply(hourcheck, axis=1)
删除不必要的数据
列名 c1 和 c2 似乎是“客户端标识符”和“经过身份验证的用户名”,但由于此日志中没有特定信息,我将它们删除。我也删除了时区,因为我不再需要它了。
del df['c1']
del df['c2']
del df['timezone']
用饼图可视化
首先,让我们使用 plotly.express 进行可视化。
IPv4/IPv6 比率
让我们通过关注具有大量数字的 status:200 来可视化 IPv4/IPv6 比率。
df_ip = df.pivot_table(index="ip_ver",columns="status",aggfunc='size',fill_value=0)
ip_fig_title = 'IPv4/v6比率'
ip_fig = px.pie(data_frame=df_ip,
values='200',
names=df_ip.index,
hover_name=df_ip.index,
labels={'ip_ver':'IP version','200':'count'})
ip_fig.update_layout(xaxis={'categoryorder':'category ascending'}, title=ip_fig_title)
ip_fig.update_traces(textinfo='percent+label')
ip_fig.show()
虽然是一点点,但似乎v4有更多。
设备类型比例
同样,让我们关注 status: 200 并显示终端类型的百分比。
df_device = df.pivot_table(index="device",columns="status",aggfunc='size',fill_value=0)
ip_fig_title = 'IPv4/v6比率'
ip_fig = px.pie(data_frame=df_ip,
values='200',
names=df_ip.index,
hover_name=df_ip.index,
labels={'ip_ver':'IP version','200':'count'})
ip_fig.update_layout(xaxis={'categoryorder':'category ascending'}, title=ip_fig_title)
ip_fig.update_traces(textinfo='percent+label')
ip_fig.show()
Windows、iPhone 和 Android 上超过 90% 的结果。
毕竟,iPhone 用户比 Android 用户多。
IPv4/IPv6 每种终端类型的百分比
接下来我们分别看一下IPv4/IPv6的终端类型比例。
df_device_ip = df.pivot_table(index="device",columns="ip_ver",aggfunc='size',fill_value=0)
device_fig_ip_title = '端末種別比率(v4)'
device_fig_ip = px.pie(data_frame=df_device_ip,
values=4,
names=df_device_ip.index,
hover_name=df_device_ip.index,
labels={'device':'Device',4:'count'})
device_fig_ip.update_layout(xaxis={'categoryorder':'category ascending'}, title=device_fig_ip_title)
device_fig_ip.update_traces(textinfo='percent+label')
device_fig_ip.show()
device_fig_ip6_title = '端末種別比率(v6)'
device_fig_ip6 = px.pie(data_frame=df_device_ip,
values=6,
names=df_device_ip.index,
hover_name=df_device_ip.index,
labels={'device':'Device',6:'count'})
device_fig_ip6.update_layout(xaxis={'categoryorder':'category ascending'}, title=device_fig_ip6_title)
device_fig_ip6.update_traces(textinfo='percent+label')
device_fig_ip6.show()
虽然是一点点,但是我们可以看到,在 IPv4 中,PC 很多,而在 IPv6 中,移动终端却很多。
这次我没有研究有什么不同,但我有点好奇。
用热图可视化
接下来,让我们看一下使用 seaborn 的热图。
按时间段的访问次数
- IPv4/IPV6
figure = sns.heatmap(pd.crosstab(df['ip_ver'], df['hour']), fmt="1.1f", lw=0.7, cmap='Blues')
- 按设备类型
figure = sns.heatmap(pd.crosstab(df['device'], df['hour']), fmt="1.1f", lw=0.7, cmap='Blues')
热图也有一些特点。
・白天从PC(公司内部访问量大吗?)
・20:00~21:00,回家路上的电车上用智能手机看吗?
一边想着一边看着热图的时候,出奇地有趣。
参考页
题外话
当我在学习的同时尝试分析数据时,我能够看到一些特征,这很有趣,因为我的想象力扩大了。
作为在未来开发中利用访问日志的一种方式,我们提出了将访问日志分析到传递服务故障信息的页面的想法。 ``增加访问权限'' ⇒ ``无法使用服务的人数增加'' ⇒ ``服务失败的可能性'',我认为这会导致无法检测到警报的静默故障... !? 由于有更新,它不再是 Apache,我想单独工作。 . .
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308632748.html