로그 분석에 대한 첫 단계 (Pandas에 로그 데이터를 성형하고 넣는 방법)

경위



현재 저는 SEO 조명 도구를 개발하는 주식회사 EXIDEA에서 인턴생으로서 앱의 로그 분석에 종사하고 있습니다. 그래서 많은 로그 데이터를 jupyternotebook에서 Pandas의 데이터 프레임에 넣어 왔습니다.
그러나 그 중에서 그 기법에 대해 간단하게 쓰여진 기사가 없다는 것을 깨달았습니다.
아무리 분석하고 싶어도 로그 데이터를 pandas에 넣지 않으면 아무것도 시작되지 않습니다.
그래서 이번에는 원시 로그 데이터를 사용하여 실제로 설명해 보겠습니다.
그럼 빨리 봅시다!!

방법 (2 단계)



· 명령으로 원하는 정보를 텍스트 파일로 결합
· pd.read_csv ()로 텍스트 파일을 데이터 프레임에 저장합니다.

이번에 사용하는 로그 데이터



샘플로 Nginx 액세스 로그를 사용합니다.
172.17.x.xxx - - [23/Jun/2020:06:25:18 +0900] "GET /xxxxx.js HTTP/1.1" 200 5032 "http://example.net/" "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) GSA/112.0.316532311 Mobile/15E148 Safari/604.1" "203.0.113.195"
172.17.x.xx - - [23/Jun/2020:06:25:18 +0900] "GET /xxxxx.js HTTP/1.1" 304 0 "http://example.net/" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 YJApp-IOS jp.co.yahoo.ipn.appli/4.16.14" "203.0.113.195"
172.17.x.xxx - - [23/Jun/2020:06:25:18 +0900] "GET /xxxxx.js HTTP/1.1" 304 0 "http://example.net/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36" "203.0.113.195"


1단계



명령으로 원하는 정보를 텍스트 파일로 결합



이 작업에서는 주로 sed, awk 명령을 사용합니다.
흐름으로서는
1. sed 명령을 사용하여 로그 데이터를 전처리합니다.
2.awk 명령으로 원하는 필드 추출

sed 명령 처리



test.txt
WhiskyWhiskyWhisky
基本的な文法
$ sed 's/置換元/置換後/g' 
ex)
$sed 's/Whisky/Beer/g' test.txt
>>>BeerBeerBeer

이제 불필요한 문자를 공백 문자로 바꾸거나 로그 데이터를 정형합니다.
이번이라면 [], ""는 Pandas에서 데이터 프레임에 넣을 때 방해가 되므로 미리 처리해 둡니다.

awk 명령 처리



test.txt
apple orange grape banana
基本的な文法
$ awk '{print 欲しいフィールド}' 
ex)#1列目と3列目が欲しい
$ awk '{print $1,$3}' test.txt
>>> apple grape 

이번에는 IP 주소, 시간, 요청, 경로, 상태 코드, referer를 원하기 때문에
1,4,6,7,11열을 추출합니다.

실제 이번 명령



명령의 처리를 정리한 것이 다음의 코드입니다.
cat access.log | sed 's/\[//g' -e  's/\]//g' -e 's/"//g' | awk '{print $1,$4,$6,$7,$11}' > test.txt

흐름



· 먼저 cat 명령으로 access.log를 엽니다.
(각 명령을 한 번에 실행하려면 |로 연결하십시오.)
· 그런 다음 sed 명령으로 [] 및 ""를 제외합니다.
(sed 명령은 -e로 쓰면 연속적으로 바꿀 수 있습니다)
· 다음으로 awk 명령으로 원하는 필드를 추출합니다.
· 마지막은 이러한 변형을 한 access.log를 test.txt로 변환

명령 실행 결과


172.17.x.xxx 23/Jun/2020:06:25:18 GET /xxxxx.js 200 http://example.net/
172.17.x.xx 23/Jun/2020:06:25:18 GET /xxxxx.js 304 http://example.net/
172.17.x.xxx 23/Jun/2020:06:25:18 GET /xxxxx.js 304 http://example.net/

2단계



pd.read_csv()로 텍스트 파일을 데이터 프레임에 저장



지금까지의 처리로, 로그 데이터가 원하는 정보만이 들어간 텍스트 파일이 되었습니다.
여기에서 한 번에 끝납니다.
import pandas as pd
columns=["IP","Datetime","method","URI","status","referer"]
df = pd.read_csv('test.txt',delimiter=' ',names=columns) #区切り文字は空白

그 결과가 여기입니다.


그 후, 한층 더 전처리를 해 가는 것으로, 시계열 분석 등을 실시할 수 있습니다.

마지막으로



이번에 이 기사에서 소개한 방법은, 나 개인이 제일 하기 쉬웠던 방법입니다. 그래서, 만약 더 간단한 방법이 있으면, 코멘트란 쪽에서 가르쳐 주실 수 있으면 다행입니다.

좋은 웹페이지 즐겨찾기