본문 바로가기

Monitoring

accesslog란? 어떻게 사용하지?

💡 참고자료

[IBM, HTTP accesslog]

[Sumologic, accesslog]

access log란 무엇일까? 해당 글은 다음과 같은 의문에서 시작하여 다음과 같은 순서로 진행된다.

  1. access log에 대하여
  2. 직접 설정하고 확인해보기

정의

  • An HTTP access log contains a record of all inbound client requests handled by HTTP endpoints.
  • 아파치 HTTP 서버에서 생성된 로그파일 중 하나이다.
  • 아파치 HTTP 서버로 처리된 모든 요청을 기록한다. 그래서 만약 사용자가 사이트의 웹페이지에 접근한다면, 이 이벤트와 관련된 모든 상세사항을 access log에 기록한다.

위치

Apache2가 설치된 위치에 따라 다른데 linux의 경우 보통 다음과 같은 위치에 있다.

/var/log/apache2/access.log

종류

  • Common Log Format
    • 아파치를 제외한 다양한 웹서버가 access log 파일을 만드는 형식과 동일하게 표준화 된 로그 포맷이다.
    • 개발자가 운영자가 보고 판단하기에 충분하여, 여러 로그 분석 플랫폼에서 사용된다.
    • 다음과 같이 생겼다.
127.0.0.1 - Scott [10/Dec/2019:13:55:36 -0700] "GET /server-status HTTP/1.1" 200 232
  • Combined Log Format
    • CLF 로그 포맷에 필요한 로그를 추가한 형태이다.
    • 전체적으로는 CLF 로그 포맷과 다르지않고, 그 뒤에 필요한 로그가 추가 됨을 알 수 있다. 예시에서는 Request의 User Agent 헤더 정보가 추가되었다.
127.0.0.1 - Scott [10/Dec/2019:13:55:36 -0700] "GET /server-status HTTP/1.1" 200 2326 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"

Custom Log: 수집할 로그를 설정하자

아파치 HTTP 서버 설정파일에서 access log에 대한 설정을 할 수 있다.

  • 로그파일 더 만들기
    • CLF 말고도 Combined 로그 포맷이 기본적으로 설정되어 있는 것처럼, 로그파일을 더 만들수도 있다. 간단하다. 밑에 형식과 경로를 지정해주면 된다. agent_access.log 파일이 생길 것이다.
  • 특정 클라이언트를 위한 로그 만들기
    • 이것도 가능하다. 자세한 정보는 공식문서에 있다.
  • 로테이션과 파이프의 개념도 있다!
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined 
LogFormat "%{User-agent}i" agent CustomLog /var/log/apache2/access.log combined 

CustomLog /var/log/apache2/agent_access.log agent

직접 설정하고 확인해보자

  • apache2.conf 파일을 수정하자. 임의로 LogFormat을 주었고 다양한 CustomLog 를 추가하였다.

  • /var/log/apache2 에서 다양한 로그파일이 생성된 것을 확인하였고, 트래픽을 많이 줬지만 기록이 제대로 안된다?
sudo service apache2 stop
sudo service apache2 start

이것에 대한 이유는 추가적으로 살펴보아야겠다. 일단은 원하는 로그를 수집했다치고, 그것을 JSON 형태로 다음 애플리케이션에 넘겨주는 것을 고민해보자.

Log를 JSON 형태로 저장하자

찾아보니 LogFormat 을 설정하면 JSON 형태로 access log를 저장할 수 있다. 방법은 다음과 같다.

나는 다음과 같은 데이터가 필요하므로, 이에 맞게 LogFormatJSON 형태로 수정한다.

LogFormat "{ \"client\":\"%h\", \"method\":\"%m\", \"status\":\"%>s\", \"url\":\"%U\", \"referer\":\"%{Referer}i\"}" json_format

json 포맷으로 로그를 만들고, 아파치를 껐다가 켜도 로그파일에 제대로 기록되지 않는다. 원인이 무엇일까? 의심되는 것이 몇가지있다.

  1. 나는 httpd.conf 가 아닌 apache2.conf 를 수정하였다.
  2. 아파치를 껐다가 켰지, 설정파일이 아파치에 제대로 먹혔는지는? 모르겠다. ⇒ 근데 로그파일이 생성된 것을 보면 설정파일이 적용된 것 같다.
  3. common 을 포함한 모든 로그파일을 주석처리하니 combined 라는 것이 나왔다? 이것이 무엇일까? 아까 읽었던 combined Log Format 인가?