ログ表示(WEBサーバー編)
データの可視化
以前、Pythonの可視化ツールの中でPlotlyについて書いた。
それを使って、集計したデータを可視化する。
データはWEBサーバーのログを使用。
事例集
1時間ごと(level_0)のサーバー(c-ip)ごとのアクセス数(count)が、以下のようにDataFrame(log2)に格納されている場合。
- 棒グラフ
import plotly.express as px
px.line(
log2,
x='level_0',
y="count"
).show()
と書くと、以下が表示される。マウスカーソルをグラフに合わせると、詳細な値を表示してくれます。
- 面グラフ
px.area(
log2,
x='level_0',
y='count',
color='c-ip'
).show()
右側に表示されている凡例をクリックすることで表示・非表示されます。
192.168.150.221を非表示にした場合。
- ファセット
並べて表示したい場合は、ファセットを使用する。
px.area(
log2,
x='level_0',
y='count',
color='c-ip',
facet_row='c-ip'
).show()
- アニメーション
アニメーションの表示もできる。再生ボタンを押すと、グラフが変化します。この場合は例が適切ではないですが。。。
px.area(
log2,
x='level_0',
y="count",
animation_frame='c-ip'
).show()
- サンバーストグラフ
サンバーストグラフにすると、ドリルダウン的にデータを見れる。
px.sunburst(
log2,
path=['c-ip','level_0'],
values="count"
).show()
この表示から、IPアドレスをクリックすると、明細が表示される。
192.168.150.163をクリックした場合。アニメーションで徐々に変わっていくところが、手が込んでいる。
- ツリーマップ
ほぼ同じ構文でツリーマップも表示され、当然ドリルダウン可。
px.treemap(
log2,
path=['c-ip','level_0'],
values="count"
).show()
- 散布図
データとしては相応しくないですが、散布図は以下の通り。
px.scatter(
log2,
x='level_0',
y="c-ip",
size='count'
).show()
まとめ
Plotlyはデータの表現力とインタラクティブ性で、データ探索している気分にさせてくれます。
DashというWebアプリケーションのフレームワークと組み合わせることで、Webアプリとして使うこともできるようです。
セキュリティ維持のために、ログの収集・集計・異常値の検出あたりをPythonで自動化して、それがPlotlyなどで可視化されて人間が目視で確認することが理想なのか、と思います。