3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

キーワードベースのログ監視からの脱却を目指して、ログクラスタリングによるパターン毎の出力頻度ヒートマップ化を試してみる

Posted at

ログの監視といえば、特定のキーワード(例えばErrorという文字列とか、Warningという文字列とか)をベースに監視ツールで検知させるといったことを実施するのが一般的かと思います。
ただ、この対処をするには、どういったログが出力されるのかを予め知っておく必要があり、その条件を決めるのもなかなか大変なのではないでしょうか。

そのようなケースに対し、もう少し分析技術の要素を取り入れて異常な状態に気づけるようにするアプローチを考えてみます。

試したこと

今回試したのは、ログをgensimdoc2vecでベクトル化し、k-meansでクラスタリング。
さらにそれを時間毎に区分けして各ログパターンの発生件数をヒートマップ化してみます。

サンプルプログラム

Python3で、gensim、matplotlib、sklearnのKMeansを利用しています。

# !/bin/env python

from gensim.models.doc2vec import Doc2Vec
from gensim.models.doc2vec import TaggedDocument
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import pandas as pd

log_name = 'sample.log'
f = open('./{}'.format(log_name), 'r', encoding='utf-8')

training_data = []
for i,line in enumerate(f):
    training_data.append(TaggedDocument(words = line.split(), tags = [i])) # tagはincrementの番号を付与
f.close

m = Doc2Vec(documents= training_data, dm=1, vector_size=300, epochs=10, window=5, min_count=1, workers=4)

vectors_list=[m.docvecs[n] for n in range(len(m.docvecs))] # 各ログのベクトル値をlist化

kmeans_model = KMeans(n_clusters=20, verbose=1, random_state=1) # 20クラスタにK-Meansで分類
kmeans_model.fit(vectors_list)

result = pd.DataFrame()

result['data'] = training_data
result['cluster_id'] = kmeans_model.labels_

count_data = result['cluster_id'].value_counts()

n = 100 # データ分割の数指定
plot_data = []
for i in range(0, len(result), n):
    cluster_count_list = [0] * kmeans_model.n_clusters
    tmp = result[i:i + n]
    tmp_v = tmp['cluster_id'].value_counts()
    for index in tmp_v.index:
        cluster_count_list[index] = tmp_v[index]
    plot_data.append(cluster_count_list)

t_data = pd.DataFrame(plot_data).T

# plot heatmap
fig, ax = plt.subplots()
heatmap = ax.pcolor(t_data, cmap=plt.cm.Greens)
plt.xlabel('time')
plt.ylabel('cluster_id')
plt.colorbar(heatmap, ax=ax)
plt.savefig('{}.png'.format(log_name))
plt.show()

# save models
import pickle
f = open('{}_doc2vec.model'.format(log_name),'wb')
pickle.dump(m, f)
f.close

f = open('{}_kmeans.model'.format(log_name), 'wb')
pickle.dump(kmeans_model, f)
f.close

このプログラムでsample.logの内容を行ごとに取り込み、空白区切りでスプリットして単語化し、doc2vecにかけて300次元のベクトルに変換。
その内容をベースに20のクラスタに分類し、各クラスタ毎の出力件数をログの100件毎にカウント。
これをx軸を時間とy軸をパターン種別に設定し、ヒートマップ化してみます。

結果はこんな感じ。ヒートマップを見ると、今回分析にかけたログのおおよそ半分ぐらいの位置から出力傾向が変わってきているのがなんとなく見えてきます。今回は見える化するところまでですが、各パターン毎の時系列でのカウント数推移をさらに分析すると傾向の変化ポイントとかも見えてきそうです。

samplelog_heatmap.png

まとめ

今回紹介した内容はあくまでサンプルで、実際に使うにはログの内容から不要なものを取り除いたりと前処理をいろいろ実施しないといけないとは思いますが、教師なしの状態でも傾向や変化が見えてきそうな予感です。
どういった分析手法がベストかはわかってないので試行錯誤中ですが。。

TISではこのようにITシステムの運用現場にデータ分析の技術を取り入れ、運用作業効率化につなげていくための活動を実施中です。同じような点に取り組んでいるとか、こういった取り組みに興味があるといった方はぜひお声がけください。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?