통합검색

Linux

[centOS] 아파치 access_log 에서 특정 시간동안의 아이피별 접속 횟수 추출하기



아파치의 access_log 파일 내용을 활용하여 특정 기간동안 아이피별로 접속 횟수를 추출해주는 스크립트 파일.

 
[!]오늘동안의 아이피별 접속 횟수 출력[/!]
vi로 sh 파일을 생성한다.
 
# vi /var/log/today_log.sh
 
파일 내용에 아래와 같이 입력한다.
 
#!/bin/bash

# 로케일을 영어(미국)으로 변경
export LC_TIME="en_US.UTF-8"

LOG_FILES=(
  "/var/log/httpd/access_log"
  #"/home/zigger.net/access_log"
  #"/home/bboggi.com/access_log"
  #"/home/note.chanyeongpark.com/access_log"
)

DATE=$(date +"%d/%b/%Y")

for LOG_FILE in "${LOG_FILES[@]}"; do
  output=$(grep "${DATE}" "${LOG_FILE}" | grep -Ev '(\.js|\.css|\.woff|\.jpg|\.jpeg|\.gif|\.png|\.bmp|\.txt)' | awk '{ip_count[$1]++} END {for (ip in ip_count) {print ip, ip_count[ip]}}' | sort -k2,2n)
  echo "[ Log File: ${LOG_FILE} ]"
  echo "$output"
  echo

echo ${DATE}

done
 
위 스크립트중 LOG_FILES 배열은 추출할 다수의 로그 파일 경로를 지정하며,
grep -Ev '(\.js|\.css|\.woff|\.jpg|\.jpeg|\.gif|\.png|\.bmp|\.txt)' 는 js, css, jpg 등 리소스 파일은 제외하고 순수한 웹페이지 파일 접속 아이피만을 추출한다.

위 스크립트를 실행하면, 아래와 같이 아이피별 접속 횟수가 출력된다.
 
# /var/log/today_log.sh
 





[!]현재 '시' 기준 아이피별 접속 횟수 출력[/!]
현재 '시'를 기준으로 아이피별 접속 횟수는 아래와 같이 작성한다.
 
#!/bin/bash

# 로케일을 영어(미국)으로 변경
export LC_TIME="en_US.UTF-8"

# 로그 파일 경로 설정
LOG_FILES=(
  "/var/log/httpd/access_log"
)

# 현재 시간을 구해서 DATE 변수에 저장 (한 시간 전으로 설정)
DATE=$(date +"%d/%b/%Y:%H")

for LOG_FILE in "${LOG_FILES[@]}"; do
  # 해당 로그 파일에서 최근 한 시간 동안의 접속 기록을 필터링하고 IP 주소별로 카운트
  output=$(grep "${DATE}" "${LOG_FILE}" | grep -Ev '(\.js|\.css|\.woff|\.jpg|\.jpeg|\.gif|\.png|\.bmp|\.txt)' | awk '{ip_count[$1]++} END {for (ip in ip_count) {print ip, ip_count[ip]}}' | sort -k2,2n)
  echo "[ Log File: ${LOG_FILE} ]"
  echo "$output"
  echo

echo ${DATE}

done