키워드 기반 로그 모니터링에서 벗어나는 것을 목표로 로그 클러스터링을 통한 패턴별 출력 빈도 히트 맵핑을 시도합니다.

로그의 감시라고 하면, 특정의 키워드(예를 들면 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축을 패턴 종별로 설정해, 히트 맵화해 보겠습니다.

결과는 이런 느낌. 히트 맵을 보면, 이번 분석에 걸친 로그의 약 절반 정도의 위치로부터 출력 경향이 바뀌어 오는 것이 어딘지 모르게 보입니다. 이번은 보이게 되는 곳까지입니다만, 각 패턴마다의 시계열에서의 카운트수 추이를 한층 더 분석하면 경향의 변화 포인트라고도 보일 것 같습니다.



요약



이번에 소개한 내용은 어디까지나 샘플로, 실제로 사용하려면 로그의 내용에서 불필요한 것을 제거하거나 전처리를 여러가지 실시해야 한다고는 생각합니다만, 교사 없는 상태에서도 경향이나 변화가 보입니다 그런 예감입니다.
어떤 분석 방법이 베스트인지는 모르기 때문에 시행착오중입니다만. .

TIS에서는 이와 같이 IT 시스템의 운용 현장에 데이터 분석 기술을 도입하여 운용 작업 효율화에 연결해 나가기 위한 활동을 실시 중입니다. 같은 점에 임하고 있다든가, 이러한 대처에 흥미가 있다고 하는 분은 꼭 말씀해 주세요.

좋은 웹페이지 즐겨찾기