Profile picture

[Linux] access.log 에서 필요한 데이터만 추출하기

JaehyoJJAng2023년 06월 09일

access.log 다운로드하기

  • access.log 파일은 웹 서버에 접속 기록을 쌓아놓는 로그 파일

curl 패키지 다운로드

$ sudo apt-get update
$ sudo apt-get install -y curl

curl 파일 다운로드 옵션 살펴보기

curl -o

  • 다운로드한 파일을 저장할 경로와 파일 이름을 지정
$ curl -o test_file https://test.com/ubuntu-18.04.6.iso

$ ls -lh ./

test_file

curl -O

  • URL에서 파일 이름을 추출하여 현재 디렉토리에 저장
$ curl -O https://test.com/ubuntu-18.04.6.iso 

$ ls -lh ./

ubuntu-18.04.6.iso 

Quest 1

  • curl 이용하여 위 파일 다운로드. 파일은 access.log 로 저장
  • 이 파일은 공백을 기준으로 각 필드 구분이 가능함. 각 필드의 기능은?

Target URL

https://gist.githubusercontent.com/yrkimyy/82a0d437caceabda591d5ac172feb5fa/raw/fd00a5211cd9a1d2aa99114d997d16ef2ad0b2af/access.log

파일 다운로드

$ curl -o access.log https://gist.githubusercontent.com/yrkimyy/82a0d437caceabda591d5ac172feb5fa/raw/fd00a5211cd9a1d2aa99114d997d16ef2ad0b2af/access.log

파일 내용 살펴보기

$ cat ./access.log | head -n 1

192.128.1.1 - - [17/May/2015:10:05:03 +0000] "GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1" 200 203023 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"

각 필드의 역할 살펴보기

|------------|----------| |필드|내용| |192.128.1.1|클라이언트의 IP 주소입니다.| |-|클라이언트의 식별자(ID)입니다. 이 필드는 보통 비워두고 있습니다.| |-|사용자 인증이 필요한 경우 사용자 이름이 기록됩니다.이 필드는 보통 비워두고 있습니다.| |[17/May/2015:10:05:03 +0000]|요청이 발생한 시각입니다.| |"GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1"|HTTP 요청 메서드와 요청한 리소스 경로, HTTP 버전입니다.| |GET|HTTP 요청 메서드입니다. 이 경우 GET 메서드가 사용되었습니다.| |/presentations/logstash-monitorama-2013/images/kibana-search.png|요청한 리소스의 경로입니다| |HTTP/1.1|HTTP 버전입니다.| |200|HTTP 응답 코드입니다. 이 경우 200은 "성공"을 의미합니다.| |203023|요청한 리소스의 크기(바이트)입니다.| |"http://semicomplete.com/presentations/logstash-monitorama-2013/"|이전에 방문한 페이지의 URL입니다.| |"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"|클라이언트에서 사용한 웹 브라우저의 정보입니다. 이 정보는 보통 "User-Agent"라고 부릅니다.|


접속 기록 통계 (1)

리눅스 커맨드를 사용해 access.log 파일에서 특정 IP 주소에 접속한 기록이 얼마나 많은지 조회하고자 함.

5.5.5.5에 접속한 기록 필터링 및 접속 횟수 조회

접속 기록 필터링

$ grep "5.5.5.5" ./access.log 

접속 횟수 조회

$ grep "5.5.5.5" ./access.log | wc -l

357

Quest 2

  • 파일 이름은 홈 디렉토리에 access_count.sh 로 생성
  • 실행 가능한 쉘 스크립트로 작성 (권한수정)
  • access_count.sh 구현 시, 각종 출력 관련 명령어 (grep,cat 등)을 활용하고, 파이프를 이용해 연결하여 구현
  • 357 이라는 숫자 출력이 되어야 함

스크립트 작성

$ vim access_count.sh

#!/bin/bash
#!/bin/bash

# Set IP
TARGET_IP='5.5.5.5'

# Set file
TARGET_FILE='./access.log'

/bin/grep "${TARGET_IP}" "${TARGET_FILE}" | /usr/bin/wc -l

권한 수정

$ chmod 700 ./access_count.sh

스크립트 실행

$ ./access_count.sh

접속 기록 통계 (2)

access.log 에서 마지막 100줄의 로그 중, 상태 코드가 200인 로그를 추출하여 새로운 파일에 저장하고자 함.

어떻게 해야 필터링한 로그만 별도로 저장할 수 있을까?. 또 새롭게 만든 파일에는 총 몇 줄의 로그가 있을까?

$ tail -n 100 ./access.log | grep '200' > ./response_200.log | wc -l

94

Quest 3

  • 파일 이름은 홈 디렉토리에 response_200_count.sh 로 생성
  • 실행 가능한 쉘 스크립트로 작성 (권한수정)
  • 필터링한 로그는 response_200.log 로 저장
  • 93이라는 숫자가 출력 되어야 함

스크립트 작성

$ vim response_200_count.sh

#!/bin/bash
TARGET_FILE='./access.log'

/usr/bin/tail -n 100 "${TARGET_FILE}" | /bin/grep '200' > ./response_200.log | /usr/bin/wc -l

Quest 4

cut 사용하기

cat access.log | cut -d ' ' -f 1 | sort | uniq -c | sort -r |head 

awk 사용하기

cat access.log | awk '{print $1}' | sort | uniq -c | sort -r | head

참고하기

쉘 스크립트에서 echo "Hello" 처럼이 아닌 /bin/echo 등과 같이 명시적으로 경로는 적는 이유?

  • 경로 미지정시 command 명령어가 어디에 설치되어 있는지에 따라 다르게 동작할 수 있음
    • 다른 컴퓨터에서 같은 스크립트 실행할 때 command를 찾을 수 없는 경우가 있을 수 있음
  • 스크립트에서 /bin/command 와 같이 명시적으로 경로를 지정하면, command 명령어의 경로가 변경되어도 스크립트가 잘 동작할 수 있음. 예를 들어, /bin이 아닌 다른 경로에 command 명령어가 설치된 경우, 스크립트에서 /bin/command를 사용하면 문제가 발생할 수 있음.

Loading script...