ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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의 평균이다. 일 단위로 점검하면서 평균값으로도 비교하면서 점검하면 좋을 것이다.

Designed by Tistory.