API World for Mobile Developers

(가이드) Access Log 의 UV / PV 분석 - Shell Script 본문

잡동사니

(가이드) Access Log 의 UV / PV 분석 - Shell Script

미니렉스 2017. 3. 15. 17:46

Apache log 분석을 쉘스크립트로 PV/UV를 산출하기

apache에 대한 이미지 검색결과

awk 명령어로 URL부분 전체를 발췌하고 cut 명령어로 ? 앞쪽만 자르면 URL(?이후의 파라미터를 제외한)만 가공할 수 있으며,

sort 명령어로 중복된 라인을 제거하면 고유한 URL로 가공이 됨.

조금 응용해서 접근한 IP 주소만으로 사용자(?)를 식별하였으나 스마트폰의 접근 IP는 중복되어 나타나므로

쇼닥 API의 세션키를 활용하여 실제 UV값을 산출함

준비작업

## 테스트에 사용한 access log file 은 2017. 2. 16 자의 API Front Apache Server 6대임
## 일단 6개 파일을 1개 파일로 뭉치고
$ ls
w14.log w15.log w16.log w17.log w20.log w21.log

$ cp w14.log total.log
$ cat w15.log >> total.log 
$ cat w16.log >> total.log 
$ cat w17.log >> total.log 
$ cat w20.log >> total.log 
$ cat w21.log >> total.log 

 

API 별 구분 방법 - (동작이 느리면) total.log 대신 w14.log 사용가능 

## 사용된 API 종류 (전체)
$ awk '{print $7}' total.log | cut -d"?" -f1 | sort -u
/v2/category/getCategoryProdList.json
/v2/category/getMainCategoryList.json
/v2/category/getProdCategoryList.json
/v2/category/martCategoryList.json

## 사용된 인증 API 종류
$ awk '{print $7}' total.log | cut -d"?" -f1 | sort -u | grep auth

## 사용된 인증 API 수량
$ awk '{print $7}' total.log | cut -d"?" -f1 | wc -l

 

사용자수 구분 방법 - (동작이 느리면) total.log 대신 w14.log 사용가능 

단순히 IP 로 확인할 수는 있지만 Android/iOS 앱에서 유입된 IP는 중복 연결시마다 IP가 변경되므로
서비스용 API내의 SessionKey 또는 AppID로 확인
## 총 사용자 수 (IP 기준)
$ awk '{print $1}' total.log | sort -u | wc -l
78259 
## 총 사용자 수 (sessionKey 파라미터가 2번째에 위치함)
$ awk -F\" '{print $2}' total.log | awk '{print $2}' | awk -F\& '{print $2}' | grep session | sort -u | wc -l
7309
$ 

## 정확한 개수는 아래처럼 구하면 되나 수량 차이는 미비함 (1명 더 챙겼음)
$ cat checkSessionKey.sh 
#!/bin/sh
awk -F\" '{print $2}' $1 | awk '{print $2}' | awk -F\& '{print $2}' | grep session > $1.sessionKey
awk -F\" '{print $2}' $1 | awk '{print $2}' | awk -F\& '{print $3}' | grep session >> $1.sessionKey
awk -F\" '{print $2}' $1 | awk '{print $2}' | awk -F\& '{print $4}' | grep session >> $1.sessionKey
awk -F\" '{print $2}' $1 | awk '{print $2}' | awk -F\& '{print $5}' | grep session >> $1.sessionKey
awk -F\" '{print $2}' $1 | awk '{print $2}' | awk -F\& '{print $6}' | grep session >> $1.sessionKey
awk -F\" '{print $2}' $1 | awk '{print $2}' | awk -F\& '{print $7}' | grep session >> $1.sessionKey
awk -F\" '{print $2}' $1 | awk '{print $2}' | awk -F\& '{print $8}' | grep session >> $1.sessionKey
awk -F\" '{print $2}' $1 | awk '{print $2}' | awk -F\& '{print $9}' | grep session >> $1.sessionKey
sort -u $1.sessionKey | wc -l

$ . ./checkSessionKey.sh total (시간 겁나걸림 : 약 2분 - MacBook 에서... )
7310
$ 


API 별 UV / PV  분석

## 총 사용자 수 (IP 기준) ## API 목록으로 PV는 $ cat total.log | grep /v2/category/getCategoryProdList.json | wc -l 2874 $   ## API 목록으로 UV는 $ cat total.log | grep /v2/category/getCategoryProdList.json | awk '{print $7}' | cut -d"&" -f2 | grep sessionKey | sort -u | wc -l 1013 $   ## 모든 API의 PV, UV는... $ cat checkPVperAPI.sh #!/bin/sh FILE_NAME=$1 FILE_TMP=$1.tmp echo "Preparing API lists ....." API_LIST=`awk -F\" '{print $2}' $FILE_NAME | awk '{print $2}' | cut -d"?" -f1 | sort -u` echo echo "PV UV API_NAME" for url_info in $API_LIST do if [ -z $url_info ] then continue fi if [ $url_info = "/" ] then continue fi # make temp flie with sepecified URL `cat $FILE_NAME | grep $url_info | awk '{print $7}' > $FILE_TMP` UV_COUNT=0 PV_COUNT=`cat $FILE_TMP | wc -l` set f1 f2 f3 f4 f5 f6 f7 f8 f9 for option in $@ do temp=`cat $FILE_TMP | cut -d'&' -$option | grep session | sort -u | wc -l` UV_COUNT=`expr $UV_COUNT + $temp` done echo $PV_COUNT $UV_COUNT $url_info done $   $ . ./checkPVperAPI.sh w14.log Preparing API lists ..... PV UV API_NAME 38 37 /auth/callAppId 1 0 /auth/getDeviceClauseAgreeInfo 9 9 /auth/getVersion 11 0 /auth/insertDeviceClauseAgreeInfo $

 

 

Comments