[완료]Apache 로그의 error code 별 페이지값을 뽑으려고 합니다.
글쓴이: help@osori.org / 작성시간: 수, 2007/08/29 - 7:13오후
우선 제가 간단히 작성한 스크립트는 이렇습니다.
#!/bin/bash LOGHOME=/var/log/httpd LOGFILE=/var/log/httpd/access_log ERRORCODE5=`cat $LOGHOME/access_log | grep 404 | awk '{print $7}' | sort -u` echo "Access Log Check now" echo "" echo "################### This is ERROR CODE 404 ##################" echo "" for LIST in $ERRORCODE5 do echo "error code 404 list is -> $LIST" echo -n "error total is -> " cat $LOGFILE | grep 404 | grep $LIST | wc -l echo "" done echo "#############################################################" echo ""
이 스크립트의 결과값은 이렇습니다.
[root@Asianux2 ~/bin]# sh error_check Access Log Check now ################### This is ERROR CODE 404 ################## error code 404 list is -> /ckm.jsp error total is -> 12 error code 404 list is -> /ckm2222.jsp error total is -> 10 error code 404 list is -> /favicon.ico error total is -> 3 error code 404 list is -> /index error total is -> 4 error code 404 list is -> /index.html error total is -> 3 error code 404 list is -> /test error total is -> 3 error code 404 list is -> /test.jsp error total is -> 1 error code 404 list is -> /test/ error total is -> 1 ############################################################# [root@Asianux2 ~/bin]#
하지만 이 스크립트에는 치명적인 문제점이 있습니다.
이를 테면 다음과 같이 access_log 의 7번째 필드는 로케이션 값이고 9번째 필드는 에러코드 값입니다.
192.168.122.1 - - [17/Aug/2007:02:13:03 +0900] "GET /ckm.jsp HTTP/1.1" 404 286 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; ko; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"
이중 9번째 필드에 404 값이 있는 파일만을 추출해야 하는데...
현재의 스크립트로서는 전체 열에서 404를 찾게 됩니다.
아무리 생각해도 답이 않나오네요.. 도와주세요 ㅠㅠ
원하는 로직은 아파치 로그의 9번째 필드 즉 에어코드 필드에서 404값이 있는 행만을 추출하여 그 행의 7번째 필드인 로케이션을 추출하고 그 로케이션값을 가진 행들중 동일한 404값을 가진 행들의 전체 카운트를 다시 뽑아내는 겁니다.
awk 와 wc -l , sort , xargs 등을 이용하면 어떻게 될것 같은데.. 도저히 감이 안오네요..
Forums:
awk를 쓰시면 됩니다.
를
정도로 고쳐보세요.
값이 틀리게 나옵니다.. ㅡㅜ
이를 테면 저 방법대로 했을 경우
[root@Asianux2 /var/log/httpd]# cat access_log | awk '$9 = "404" {print $7}' | sort -u
/
/ckm.jsp
/ckm2222.jsp
/favicon.ico
/icons/apache_pb2.gif
/icons/powered_by_ax.png
/index
/index.html
/test
/test.jsp
/test/
[root@Asianux2 /var/log/httpd]#
[root@Asianux2 /var/log/httpd]#
[root@Asianux2 /var/log/httpd]#
[root@Asianux2 /var/log/httpd]# cat access_log | grep "powered_by_ax.png" | grep "404"
[root@Asianux2 /var/log/httpd]#
[root@Asianux2 /var/log/httpd]#
보는것과 같이 값이 틀리게 나옵니다.
값이 틀리게 나오네요..
이를 테면 저 방법대로 했을 경우
[root@Asianux2 /var/log/httpd]# cat access_log | awk '$9 = "404" {print $7}' | sort -u
/
/ckm.jsp
/ckm2222.jsp
/favicon.ico
/icons/apache_pb2.gif
/icons/powered_by_ax.png
/index
/index.html
/test
/test.jsp
/test/
[root@Asianux2 /var/log/httpd]#
[root@Asianux2 /var/log/httpd]#
[root@Asianux2 /var/log/httpd]#
[root@Asianux2 /var/log/httpd]# cat access_log | grep "powered_by_ax.png" | grep "404"
[root@Asianux2 /var/log/httpd]#
[root@Asianux2 /var/log/httpd]#
보는것과 같이 값이 틀리게 나옵니다.
해결법을 찾았습니다. 신텍스 문제였네요
= 과 " 가 아니라
$9 ~ /404/ 로 하면 되네요. ㅎㅎ
man 페이지중 내용 - 첫 번째 필드가 good와 일치하는 레코드에 대해 세 번째 필드를 먼저 출력하고 두 번째 필드를 나중에 출력하고 싶을 때 $1 ~ /good/ { print $3 , $2 }
댓글 달기