본문 바로가기
[IT] Spring Boot (JAVA)

[Spring Boot] Tomcat Access Log 설정

by 오리엔탈킴 2022. 6. 28.

Spring Boot의 내장된 Tomcat을 사용하여 웹 애플리케이션이나 API 서비스를 구현하는 경우의 Tomcat Web Server의 Access Log 설정을 어떻게 하는지에 대해 정리를 하려고 합니다.

기본적인 Spring Boot와 Embedded Tomcat을 이용하는 경우, 웹서버의 Access Log는 별도 설정을 해야만 로그가 남게 됩니다. Spring Boot의 프로퍼티에 server.tomcat.access 로그 관련 설정을 해야 하는데 여기서는 yml 파일에 설정하는 것을 기준으로 작성하겠습니다.

Spring Boot application.yml 파일에 Tomcat Access Log 설정

server:
  tomcat:
    accesslog:
      enabled: true
      directory: D:/logs
      prefix: myApp_access_log.
      suffix: .txt
      #rotate: true
      file-date-format: yy-MM-dd #yy-MM-dd.HH
      #encoding: UTF-8
      #max-days: -1
      #rename-on-rotate: false
      #buffered: false
      #condition-if: name #ServletRequest.getAttribute("name") != null
      #condition-unless: name #ServletRequest.getAttribute("name") == null
      pattern: '%h %l %u [%{yy-MM-dd:HH:mm:ss}t] "%r" %s %b %D %{User-Agent}i' #'%h %l %u %t "%r" %s %b'

 

위와 같이 application.yml 프로퍼티 파일에 Tomcat Access Log를 설정하여 남길 수 있습니다. 주요 설정이라고 생각하는 것들만 우선 적어 놨는데, 각 설정의 상세 내용은 아래와 같습니다.

  • enabled : default false로 되어 있어서 로그가 생성이 안되는데, 로그를 남기려면 true로 설정
  • directory : 로그가 저장될 경로설정으로 절대 및 상대 경로로 설정할 수 있고, 상대경로로 설정을 하려면 tomcat.basedir도 세팅
  • prefix : 로그 파일명의 앞에 해당하는 prefix 설정으로 저장 될 파일명 설정 (Default는 access_log)
  • suffix : 로그 파일명의 뒤에 해당하는 suffix 설정으로 기본 값이 ".log"라서 log 파일형식으로 저장되는데, ".txt"와 같이 파일형식 변경 가능
  • rotate : 일정 시간 간격으로 새로운 파일로 저장할지 설정하는 값으로 기본 값이 true라서 별도 설정은 필요없고, 만약 파일 1개에 계속 로그를 쌓고 싶으면 false로 설정
  • file-date-format : rotate된 파일의 날짜 파일명 규칙으로 설정을 하지 않으면 access_log.2022-06-28.log와 같이 .yyyy-MM-dd 형태로 저장 됨, .yyyy-MM-dd.HH 혹은 .yyyy-MM-dd.HH.mm과 같이 설정하면 시간 혹은 분별로 로그파일 저장
  • encoding : 인코딩은 기본 시스템의 인코딩을 따르기 때문에 수정이 필요한 경우에만 설정
  • max-days : 최대 로그를 x일 까지 저장하고 그 이상 오래된 로그는 삭제를 할지 설정, 기본값이 -1 (삭제하지 않음)로 되어 있음
  • rename-on-rotate : 오늘의 로그 파일명에 Date를 붙일지 말지, 즉 access_log.log로 할지, access_log.2022-06-28.log로 할지를 설정 (기본 값은 false로 현재 로그 파일명에 Date를 붙임)
  • buffered : request가 종료되는 즉시 로그를 작성할지, 버퍼를 두고 여러개를 한번에 작성할지 설정 (기본 값은 false로 버퍼를 두고 작성)
  • condition-if : ServletRequest.getAttribute("name")이 null이 아닌 호출만 로그 저장
  • condition-unless : ServletRequest.getAttribute("name")이 null인 호출만 로그 저장
  • pattern : 로그 패턴의 기본 설정 (Defualt 설정) 값은 '%h %l %u %t "%r" %s %b'로 예시로 아래와 같이 로그가 저장
127.0.0.1 - - [28/Jun/2022:11:07:14 +0900] "GET /user/list?junk=jumm HTTP/1.1" 200 64

위의 예시와 같이 '%h %l %u [%{yy-MM-dd:HH:mm:ss}t] "%r" %s %b %D %{User-Agent}i'와 같이, 응답 시간인 %D와 User-Agent Header 출력 설정(%i)을 하고 로그를 저장하면 아래와 같이 저장됨

127.0.0.1 - - [22-06-28:11:11:39] "GET /user/list?junk=jumm HTTP/1.1" 200 64 3 PostmanRuntime/7.29.0

 

Access Log Pattern 문법

아래 Tomcat 공식 문서에 상세하게 나와있는데, Access 로그에 남길 수 있는 항목과 Log Pattern에 정의되는 각 예약어 문법은 아래와 같습니다.

https://tomcat.apache.org/tomcat-8.5-doc/config/valve.html#Access_Logging
%a - Remote IP address 
%{xxx}a - write remote address (client) (xxx==remote) or connection peer address (xxx=peer)
%A - Local IP address
%b - Bytes sent, excluding HTTP headers, or '-' if zero
%B - Bytes sent, excluding HTTP headers
%h - Remote host name (or IP address if enableLookups for the connector is false)
%H - Request protocol
%l - Remote logical username from identd (always returns '-')
%m - Request method (GET, POST, etc.)
%p - Local port on which this request was received 
%{xxx}p - write local (server) port (xxx==local) or remote (client) port (xxx=remote)
%q - Query string (prepended with a '?' if it exists)
%r - First line of the request (method and request URI) 
%{xxx}r - write value of ServletRequest attribute with name xxx (escaped if required)
%s - HTTP status code of the response
%{xxx}s - write value of HttpSession attribute with name xxx (escaped if required)
%S - User session ID
%t - Date and time, in Common Log Format 
%{xxx}t - write timestamp at the end of the request formatted using the enhanced SimpleDateFormat pattern xxx
%u - Remote user that was authenticated (if any), else '-' (escaped if required)
%U - Requested URL path
%v - Local server name
%D - Time taken to process the request in millis.
%T - Time taken to process the request, in seconds.
%F - Time taken to commit the response, in milliseconds
%I - Current request thread name (can compare later with stacktraces)
%X - Connection status when response is completed (X = Connection aborted before the response completed. / + = Connection may be kept alive after the response is sent. / - = Connection will be closed after the response is sent.)
%{xxx}i - write value of incoming header with name xxx (escaped if required)
%{xxx}o - write value of outgoing header with name xxx (escaped if required)
%{xxx}c - write value of cookie with name xxx (escaped if required)

 

반응형

댓글