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. Формат
Итак, если это свойство включено, мы увидим что-то вроде следующего в нашем запущенном приложении:
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
%>s
– код состояния, отправленный с сервера клиенту, например, 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
Наконец, мы можем переопределить способ записи журналов в файл журнала:
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 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
6. Заключение
В этой быстрой статье мы узнали разницу между внутренним журналом Tomcat и журналом доступа. Затем мы увидели, как включить и настроить их.
Обязательно ознакомьтесь с образцом на GitHub .