-
[Python] Pandas를 이용한 IIS 웹 로그 분석 (sc-bytes, cs-bytes)Python/Python For Analytics 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의 평균이다. 일 단위로 점검하면서 평균값으로도 비교하면서 점검하면 좋을 것이다.
'Python > Python For Analytics' 카테고리의 다른 글
[Python] numpy setdiff1d(차집합)을 이용한 2개의 텍스트 파일 비교 (0) 2019.10.30 [Python] pandas rank를 이용한 순위 표시 (0) 2019.10.28 [Python] pandas groupby - count, max, min, mean, sum, agg (0) 2019.10.28 [Python] pandas의 sort_values를 이용한 dataframe 정렬 (0) 2019.10.24 [Python] Pandas DataFrame 컬럼명 특정 문자로 변경 (0) 2019.09.25 [Python] pandas datetime 타입 시간/주/일 더하기 (0) 2019.09.06 [Python] list data type pandas의 DataFrame 만들기 (0) 2019.09.04 [Python] pandas를 이용한 IIS log 파싱 (0) 2019.08.30