«1. Введение

Spring Boot поставляется со встроенным сервером Tomcat, что очень удобно. Однако по умолчанию мы не можем видеть журналы Tomcat.

В этом руководстве мы узнаем, как настроить Spring Boot для отображения внутренних журналов и журналов доступа Tomcat через игрушечное приложение.

2. Пример приложения

Прежде всего, давайте создадим REST API. Мы определим GreetingsController для приветствия пользователя:

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

3. Типы журналов Tomcat

Встроенный Tomcat хранит два типа журналов:

    Журналы доступа Внутренние журналы сервера

Журналы доступа хранят записи всех запросов, обработанных приложением. Эти журналы можно использовать для отслеживания таких вещей, как количество посещений страниц и активность сеансов пользователей. Напротив, внутренние журналы сервера помогут нам устранить любые проблемы в нашем работающем приложении.

4. Журналы доступа

По умолчанию журналы доступа не включены.

Мы можем легко включить их, добавив свойство в application.properties:

server.tomcat.accesslog.enabled=true

Точно так же мы можем использовать аргументы виртуальной машины для включения журналов доступа:

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

Эти файлы журналов будут создан во временном каталоге. Например, в Windows каталог для журналов доступа будет выглядеть примерно так: AppData\\Local\\Temp\\tomcat.2142886552084850151.40123\\logs

4.1. Format

Итак, если это свойство включено, мы увидим в нашем работающем приложении что-то вроде следующего:

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 — идентификатор пользователя % u — имя пользователя, определенное HTTP-аутентификацией %t — время получения запроса %r — строка запроса от клиента, GET /greetings/Harry HTTP/1.1 в данном случае %\u003es — «код состояния, отправленный с сервера клиенту, например, 200 здесь %b — размер ответа клиенту или 27 для этих запросов

Так как этот запрос не имел аутентифицированного пользователя, %l и %u напечатал тире.

На самом деле, если какая-либо информация отсутствует, Tomcat напечатает прочерк для этого слота.

4.2. Настройка журналов доступа

Мы можем переопределить конфигурацию Spring Boot по умолчанию, добавив несколько свойств в application.properties.

Во-первых, чтобы изменить имя файла журнала по умолчанию:

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

Наконец, мы можем переопределить способ записи журналов в журнал file:

server.tomcat.accesslog.pattern=common

В Spring Boot есть еще несколько настраиваемых свойств.

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 и журналом доступа. Затем мы увидели, как включить и настроить их.

Обязательно ознакомьтесь с образцом на GitHub.