Spring Boot埋め込みTomcatログ

1. 前書き

Spring BootにはTomcatサーバーが組み込まれています。これは非常に便利です。 ただし、デフォルトではTomcatのログを表示できません。
このチュートリアルでは、Toyアプリケーションを介してTomcatの内部ログとアクセスログを表示するようにSpring Bootを設定する方法を学習します。

2. サンプルアプリケーション

まず、REST APIを作成しましょう。 _GreetingsController_を定義して、ユーザーに挨拶します。
@GetMapping("/greetings/{username}")
public String getGreetings(@PathVariable("username") String userName) {
    return "Hello " + userName + ", Good day...!!!";
}

3. Tomcatログタイプ

組み込みTomcatは、2種類のログを保存します。
  • アクセスログ

  • 内部サーバーログ

    _access logs_は、アプリケーションによって処理されたすべてのリクエストの記録を保持します。 これらのログは、*ページヒットカウントや*ユーザーセッションアクティビティ*などを追跡するために使用できます。 対照的に、_internal server logs_は、実行中のアプリケーションの問題のトラブルシューティングに役立ちます。

4. アクセスログ

デフォルトでは、アクセスログは有効になっていません。
ただし、_application.properties_にプロパティを追加することで簡単に有効にできます。
server.tomcat.accesslog.enabled=true
同様に、VM引数を使用してアクセスログを有効にできます。
java -jar -Dserver.tomcat.basedir=tomcat -Dserver.tomcat.accesslog.enabled=true app.jar
*これらのログファイルは一時ディレクトリに作成されます。*たとえば、Windowsでは、アクセスログのディレクトリは_AppData \ Local \ Temp \ tomcat.2142886552084850151.40123 \ logs_のようになります。

4.1. フォーマット

したがって、このプロパティを有効にすると、実行中のアプリケーションに次のようなものが表示されます。
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
これらはアクセスログであり、形式は次のとおりです。
%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_ –から送信されたステータスコードto__200 __here + _%b_ –クライアントへの応答のサイズ、またはこれらの要求の場合は__27for__
このリクエストには認証されたユーザーがいないため、_%lおよび%u_はダッシュを出力しました。
実際、*情報が欠落している場合、Tomcatはそのスロットにダッシュを表示します*。

4.2. アクセスログのカスタマイズ

_application.propertiesにいくつかのプロパティを追加することにより、デフォルトのSpring Boot設定をオーバーライドできます。 _
まず、デフォルトのログファイル名を変更するには:
server.tomcat.accesslog.suffix=.log
server.tomcat.accesslog.prefix=access_log
server.tomcat.accesslog.file-date-format=.yyyy-MM-dd
また、ログファイルの場所を変更できます。
server.tomcat.basedir=tomcat
server.tomcat.accesslog.directory=logs
最後に、ログがログファイルに書き込まれる方法をオーバーライドできます。
server.tomcat.accesslog.pattern=common
Spring Bootにはhttps://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html [設定可能なプロパティ]がさらにいくつかあります。

5. 内部ログ

Tomcatサーバーの内部ログは、サーバー側の問題を解決するのに非常に役立ちます。
これらのログを表示するには、_application.properties_のログ設定を以下に追加する必要があります。
logging.level.org.apache.tomcat=DEBUG
logging.level.org.apache.catalina=DEBUG
そして、次のようなものが表示されます。
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 [email protected] 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

6. 結論

この簡単な記事では、Tomcatの内部ログとアクセスログの違いを学びました。 次に、それらを有効にしてカスタマイズする方法を見ました。
サンプルhttps://github.com/eugenp/tutorials/tree/master/spring-boot-ops-2[GitHub上]を必ずチェックしてください。