Python/Python For Analytics

[Python] Pandas를 이용한 IIS 웹 로그 분석 (sc-bytes, cs-bytes)

Pydole 2019. 10. 23. 13:20

sc-bytes : 어플리케이션(웹 사이트)에서 클라이언트로 보낸 bytes.

cs-bytes : 클라이언트에서 어플리케이션(웹 사이트)로 보낸 bytes.

 

 

 IIS로그 필드 중 sc-bytes와 sc-bytes는 웹 사이트와 클라이언트간 통신양(bytes)를 숫자로 표기한 것으로 웹 사이트의

성능을 분석하는 데 있어 중요한 데이터이다.

 

 특히, On-premise가 아닌 클라우드 환경에서 웹 사이트를 서비스할 경우 sc-bytes는 아웃바운드 트래픽을 가늠하기에 좋은

지표이기 때문에(아웃바운드 트래픽 = 요금) 유심깊게 점검하는 편이 좋다.

 

 


 

 

IIS 웹 로그를 pandas dataframe 만들기

 

import pandas as pd

log_field = ['date', 'time', 's-sitename', 's-computername' , 's-ip' , 'cs-method' , 'cs-uri-stem',
             'cs-uri-query', 's-port' ,'cs-username', 'c-ip', 'cs-version', 'cs-User-Agent', 'cs-Cookie',
             'cs-Referer', 'cs-host', 'sc-status', 'sc-substatus', 'sc-win32-status', 'sc-bytes',
             'cs-bytes', 'time-taken']

df = pd.read_csv('sample.log', sep=' ', comment='#', engine='python', names=log_field)

print(df)
--------------------------------------------------------------------------------------------------------
              date      time s-sitename  ... sc-bytes cs-bytes time-taken
0       2019-08-05  15:00:00     W3SVC8  ...    12633      688         77
1       2019-08-05  15:00:01     W3SVC8  ...       99     1090         15
2       2019-08-05  15:00:01     W3SVC8  ...      663      226         31
3       2019-08-05  15:00:01     W3SVC8  ...      349      979         77
4       2019-08-05  15:00:01     W3SVC8  ...      663      226         15
...            ...       ...        ...  ...      ...      ...        ...
161020  2019-08-06  14:54:30     W3SVC8  ...      702      940          0
161021  2019-08-06  14:54:30     W3SVC8  ...      663      226         31
161022  2019-08-06  14:59:38     W3SVC8  ...      437      862         31
161023  2019-08-06  14:59:38     W3SVC8  ...      431      943         31
161024  2019-08-06  14:59:38     W3SVC8  ...      663      226         46

[161025 rows x 22 columns]

 총 index를 제외한 22개의 필드의 16만개 rows의 dataframe으로 생성되었다.

 

 


 

sc-bytes, cs-bytes의 MAX(최대) bytes 구하기

 

print('sc-bytes 의 최대값은 %d bytes 입니다.' %df['sc-bytes'].max(axis=0))
print('cs-bytes 의 최대값은 %d bytes 입니다.' %df['cs-bytes'].max(axis=0))
-------------------------------------------------------------------------
sc-bytes 의 최대값은 4332483 bytes 입니다.
cs-bytes 의 최대값은 1341 bytes 입니다.

 MAX Bytes를 통해 sc-bytes에서 큰 용량의 컨텐츠를 찾아낸다. 만약 평소에는 10M 이하를 유지하다가 50M, 100M가 검출된다면 해당 MAX값과 cs-uri-stem과 필드를 같이 검출하여, 압축않한 고용량 이미지 파일, 문서, 글꼴 등이 없는지 점검한다.

 

 

좀 더 상세하게 보려면 sc-bytes로 내림차순으로 정렬하여, cs-uri-stem과 같이 출력이 가능하고,

 

print(df[['cs-uri-stem','sc-bytes']].sort_values(by='sc-bytes', ascending=False).head(100))
--------------------------------------------------------------------------------------------
159771            /include/font/NanumGothic.ttf   4332483
152148            /include/font/NanumGothic.ttf   4332483
144330            /include/font/NanumGothic.ttf   4332483
693               /include/font/NanumGothic.ttf   4332483
144050            /include/font/NanumGothic.ttf   4332483
...                                         ...       ...
103548  /include/font/NanumGothicExtraBold.woff   2294424
31290   /include/font/NANUMGOTHICEXTRABOLD.woff   2294424
35285   /include/font/NanumGothicExtraBold.woff   2294424
86143   /include/font/NanumGothicExtraBold.woff   2294424
95547   /include/font/NanumGothicExtraBold.woff   2294424

 

 

부가적으로 matplotlib과 seaborn을 이용하여 시계열로 시각화도 가능하다

 

import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime, timedelta

df['time'] = pd.DatetimeIndex(df['time']) + timedelta(hours=9)

sns.set()

plt.figure(figsize=(20, 5))

plt.plot(df['time'], df['sc-bytes'], 'r*', label='sc-bytes')
plt.legend(loc=0)
plt.show()

 

 또한, MAX Bytes를 통해 cs-bytes에서 큰 용량의 업로드가 있는지 역으로 점검할 수 있다. 특히 파일 업로드 게시판 같은 경우 유용한 지표가 될 수 있다.

 

 


 

sc-bytes, cs-bytes의 MIN(최소) 구하기

 

print('sc-bytes 의 최소값은 %d bytes 입니다.' %df['sc-bytes'].min(axis=0))
print('cs-bytes 의 최소값은 %d bytes 입니다.' %df['cs-bytes'].min(axis=0))
------------------------------------------------------------------------
sc-bytes 의 최소값은 0 bytes 입니다.
cs-bytes 의 최소값은 174 bytes 입니다.

 

Min Bytes는 sc-bytes에서 0의 값이 중요한데, 서버에서 503에러가 발생할 경우 0으로 찍히게 된다. 특정구간에 0이 많이 찍혔다면 의심해볼만 하다.

 

 

 


 

sc-bytes, cs-bytes의 SUM(합계) 구하기

 

print('sc-bytes 의 총 용량은 %d bytes 입니다.' %df['sc-bytes'].sum(axis=0))
print('cs-bytes 의 총 용량은 %d bytes 입니다.' %df['cs-bytes'].sum(axis=0))
-------------------------------------------------------------------------
sc-bytes 의 총 용량은 1849538882 bytes 입니다.
cs-bytes 의 총 용량은 113327159 bytes 입니다.

 

 SUM Bytes는 sc-bytes의 총합이다. 만약 일 단위 로그라면 웹 사이트 일 단위 아웃바운드 트래픽 용량일 것이다.

웹 사이트외 서버의 통신 트래픽은 별도이긴 하나, 서버 용도가 웹 사이트 전용이면 비슷하게 유추할 수 있을 것이다.

 


 

sc-bytes, cs-bytes의 MEAN(평균) 구하기

 

print('sc-bytes 의 평균값은 %d bytes 입니다.' %df['sc-bytes'].mean(axis=0))
print('cs-bytes 의 평균값은 %d bytes 입니다.' %df['cs-bytes'].mean(axis=0))
-------------------------------------------------------------------------
sc-bytes 의 평균값은 11486 bytes 입니다.
cs-bytes 의 평균값은 703 bytes 입니다.

 

 Mean Bytes는 sc-bytes의 평균이다. 일 단위로 점검하면서 평균값으로도 비교하면서 점검하면 좋을 것이다.