Post

Spring Boot 내장 Tomcat 로그

1. Sample Application

REST API를 만들고, 사용자에게 인사하는 GreetingsController를 정의한다.

1
2
3
4
@GetMapping("/greetings/{username}")
public String getGreetings(@PathVariable("username") String userName) {
    return "Hello " + userName + ", Good day...!!!";
}

2. Tomcat 로그 유형

내장된 Tomcat은 두 가지 유형의 로그를 저장한다.

  • Access logs

  • Internal server logs

access logs는 애플리케이션에서 처리된 모든 요청의 기록을 유지한다. 이러한 로그는 페이지 조회수, 사용자 세션 활동 등을 추적 하는데 사용될 수 있다. 반면, internal server logs는 실행 중인 애플리케이션의 문제를 해결하는데 도움이 된다.

3. 접속 로그

기본적으로 액세스 로그는 활성화되어 있지 않다.

하지만 application.properties에 속성을 추가하면 쉽게 활성화할 수 있다.

1
server.tomcat.accesslog.enabled=true

마찬가지로 VM 인수를 사용하여 액세스 로그를 활성화할 수 있다.

1
java -jar -Dserver.tomcat.basedir=tomcat -Dserver.tomcat.accesslog.enabled=true app.jar

이러한 로그 파일은 임시 디렉터리에 생성된다. 예를 들어 Windows에서 액세스 로그 디렉터리는 AppData\Local\Temp\tomcat.2142886552084850151.40123\logs와 같다.

1) Format

이 속성을 활성화하면 실행 중인 애플리케이션에 다음과 같은 내용이 표시된다.

1
2
0:0:0:0:0:0:0:1 - - [13/May/2019:23:14:51 +0530] "GET /greetings/Harry HTTP/1.1" 200 27
0:0:0:0:0:0:0:1 - - [13/May/2019:23:17:23 +0530] "GET /greetings/Harry HTTP/1.1" 200 27

이는 액세스 로그이며 형식은 다음과 같습다.

1
%h %l %u %t \"%r\" %>s %b

다음과 같이 해석할 수 있다.

  • %h - 요청을 보낸 클라이언트 IP, 이 경우 0:0:0:0:0:0:0:1
  • %l - 사용자의 ID
  • %u - HTTP 인증에 의해 결정된 사용자 이름
  • %t - 요청이 수신된 시간
  • %r - 클라이언트의 요청 라인, 이 경우 GET /greetings/Harry HTTP/1.1
  • %>s - 서버에서 클라이언트로 전송된 상태 코드, 여기서는 200
  • %b - 클라이언트에 대한 응답 크기 또는 이러한 요청의 경우 27

이 요청에는 인증된 사용자가 없으므로 %l%u는 대시를 인쇄했다.

실제로 정보가 누락된 경우 Tomcat은 해당 슬롯에 대해 대시를 인쇄한다.

2) 액세스 로그 사용자 정의

application.properties에 몇 가지 속성을 추가하여 기본 Spring Boot 구성을 재정의할 수 있다.

먼저 기본 로그 파일 이름을 변경하려면 다음을 수행한다.

1
2
3
server.tomcat.accesslog.suffix=.log
server.tomcat.accesslog.prefix=access_log
server.tomcat.accesslog.file-date-format=.yyyy-MM-dd

또한 로그 파일의 위치를 ​​변경할 수 있다.

1
2
server.tomcat.basedir=tomcat
server.tomcat.accesslog.directory=logs

마지막으로 로그 파일에 로그가 기록되는 방식을 재정의할 수 있다.

1
server.tomcat.accesslog.pattern=common

Spring Boot에는 구성 가능한 속성이 몇 가지 더 있다.

4. 내부 로그

Tomcat 서버의 내부 로그는 서버 측 문제를 해결하는데 매우 유용하다.

이러한 로그를 보려면 application.properties에 아래 로깅 구성을 추가해야 한다.

1
2
logging.level.org.apache.tomcat=DEBUG
logging.level.org.apache.catalina=DEBUG

그러면 다음과 같은 내용이 표시된다.

1
2
3
4
5
6
7
8
9
10
11
2019-05-17 15:41:07.261 DEBUG 31160 --- [0124-Acceptor-0] o.apache.tomcat.util.threads.LimitLatch  : Counting up[http-nio-40124-Acceptor-0] latch=1
2019-05-17 15:41:07.262 DEBUG 31160 --- [0124-Acceptor-0] o.apache.tomcat.util.threads.LimitLatch  : Counting up[http-nio-40124-Acceptor-0] latch=2
2019-05-17 15:41:07.278 DEBUG 31160 --- [io-40124-exec-1] org.apache.tomcat.util.modeler.Registry  : Managed= Tomcat:type=RequestProcessor,worker="http-nio-40124",name=HttpRequest1
...
2019-05-17 15:41:07.279 DEBUG 31160 --- [io-40124-exec-1] m.m.MbeansDescriptorsIntrospectionSource : Introspected attribute virtualHost public java.lang.String org.apache.coyote.RequestInfo.getVirtualHost() null
...
2019-05-17 15:41:07.280 DEBUG 31160 --- [io-40124-exec-1] o.a.tomcat.util.modeler.BaseModelMBean   : preRegister org.apache.coyote.RequestInfo@1e6f89ad Tomcat:type=RequestProcessor,worker="http-nio-40124",name=HttpRequest1
2019-05-17 15:41:07.292 DEBUG 31160 --- [io-40124-exec-1] org.apache.tomcat.util.http.Parameters   : Set query string encoding to UTF-8
2019-05-17 15:41:07.294 DEBUG 31160 --- [io-40124-exec-1] o.a.t.util.http.Rfc6265CookieProcessor   : Cookies: Parsing b[]: jenkins-timestamper-offset=-19800000
2019-05-17 15:41:07.296 DEBUG 31160 --- [io-40124-exec-1] o.a.c.authenticator.AuthenticatorBase    : Security checking request GET /greetings/Harry
2019-05-17 15:41:07.296 DEBUG 31160 --- [io-40124-exec-1] org.apache.catalina.realm.RealmBase      :   No applicable constraints defined

[출처 및 참고]

This post is licensed under CC BY 4.0 by the author.