Logger in java spring

Логирование

Spring Boot использует Commons Logging для всеохватывающего логирования (журналирования, logging) на внутреннем уровне, но оставляет открытой базовую реализацию лога. Конфигурации по умолчанию предусмотрены для Java Util Logging, Log4J2 и Logback. В каждом случае диспетчеры логирования предварительно сконфигурированы на использование консольного вывода с возможностью вывода в файл.

По умолчанию, если используются «Стартеры», для ведения лога используется Logback. Соответствующая маршрутизация Logback также предусмотрена для обеспечения корректной работы зависимых библиотек, использующих Java Util Logging, Commons Logging, Log4J или SLF4J.

Для Java доступно множество фреймворков логирования. Не волнуйтесь, если приведенный выше список вводит в ступор. Как правило, изменять зависимости логирования не нужно, и настройки Spring Boot по умолчанию работают просто отлично.

Если вы развертываете свое приложение в контейнере сервлетов или на сервере приложений, логирование, выполняемое с помощью API- интерфейса Java Util Logging, не маршрутизируется к логам приложения. Это предотвращает появление в логах приложения записей, выполняемых контейнером или другими приложениями, которые были развернуты в нем.

Формат логгера

Вывод лога по умолчанию в Spring Boot похож на следующий пример:

2022-10-20 12:40:11.311 INFO 16138 --- [ main] o.s.b.d.f.s.MyApplication : Starting MyApplication using Java 1.8.0_345 on myhost with PID 16138 (/opt/apps/myapp.jar started by myuser in /opt/apps/) 2022-10-20 12:40:11.330 INFO 16138 --- [ main] o.s.b.d.f.s.MyApplication : No active profile set, falling back to 1 default profile: "default" 2022-10-20 12:40:13.056 INFO 16138 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2022-10-20 12:40:13.070 INFO 16138 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2022-10-20 12:40:13.070 INFO 16138 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.68] 2022-10-20 12:40:13.178 INFO 16138 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2022-10-20 12:40:13.178 INFO 16138 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1762 ms 2022-10-20 12:40:13.840 INFO 16138 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2022-10-20 12:40:13.850 INFO 16138 --- [ main] o.s.b.d.f.s.MyApplication : Started MyApplication in 4.062 seconds (JVM running for 5.452)

Выводятся следующие элементы:

  • Дата и время: точность до миллисекунды и легкая сортировка.
  • Уровень ведения лога: ERROR , WARN , INFO , DEBUG или TRACE .
  • Идентификатор процесса.
  • Разделитель — для разделения начала фактических сообщений лога.
  • Название потока: заключено в квадратные скобки (может быть усечено для вывода в консоль).
  • Имя диспетчера логирования: обычно это имя исходного класса (часто сокращенное).
  • Сообщение лога.
Читайте также:  Azure devops api python

Консольный вывод

В конфигурации лога по умолчанию сообщения отражаются в консоль по мере их записи. По умолчанию в лог записываются сообщения уровней ERROR , WARN и INFO . Вы также можете активировать режим «отладки», запустив приложение с флагом —debug .

Если режим отладки активирован, набор основных диспетчеров логирования (встроенный контейнер, Hibernate и Spring Boot) конфигурируется для вывода дополнительной информации. Активация режима отладки не конфигурирует приложение на регистрацию всех сообщений с уровнем DEBUG .

Кроме того, можно активировать режим «трассировки», запустив приложение с флагом —trace (или trace=true в файле application.properties ). Это позволяет регистрировать лог трассировки для ряда основных диспетчеров логирования (встроенный контейнер, генерация схемы Hibernate и весь портфель Spring).

Вывод с цветовой подсветкой

Если терминал поддерживает ANSI, для облегчения чтения используется цветовой вывод. Можно установить spring.output.ansi.enabled в поддерживаемое значение чтобы переопределить автоматическое обнаружение.

Цветовое кодирование конфигурируется с помощью слова преобразования %clr . В своей простейшей форме преобразователь окрашивает вывод в соответствии с уровнем лога, как показано в следующем примере:

В следующей таблице описано соответствие уровней лога цветам:

Источник

Logging in Spring Boot

Learn to customize the default logging or implement a new logging facility in a Spring boot application.

1. Overview

Spring Boot uses Commons Logging for all logging internal to the framework and thus it is a mandatory dependency. For other logging needs, Spring boot supports default configuration for Java Util Logging, Log4J2, and Logback.

When using the spring boot starters, each starter depends on spring-boot-starter-logging which in turn includes logback, log4j2 and Java util logging in the project.

Each Spring boot 2.x starter also depends on Spring 5 that brings in the spring-jcl module for commons-logging.

[INFO] | +- org.springframework.boot:spring-boot-starter-logging:jar:2.6.1:compile [INFO] | | +- ch.qos.logback:logback-classic:jar:1.2.7:compile [INFO] | | | +- ch.qos.logback:logback-core:jar:1.2.7:compile [INFO] | | | \- org.slf4j:slf4j-api:jar:1.7.32:compile [INFO] | | +- org.apache.logging.log4j:log4j-to-slf4j:jar:2.14.1:compile [INFO] | | | \- org.apache.logging.log4j:log4j-api:jar:2.14.1:compile [INFO] | | \- org.slf4j:jul-to-slf4j:jar:1.7.32:compile . [INFO] | +- org.springframework:spring-core:jar:5.3.13:compile [INFO] | | \- org.springframework:spring-jcl:jar:5.3.13:compile

2. Default Logging Configuration

The default logging for the application is done by Logback. We can use directly use the Logback API or use the SLF4J APIs to write the log messages.

For demo purposes, we have bootstrapped a very simple spring boot application with minimum dependencies.

We have added a few log statements in LoggerController for testing purposes. we are using the SLF4J provided Logger and LoggerFactory API.

import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class LoggerController < Logger logger = LoggerFactory.getLogger(LoggerController.class); @GetMapping ("/logs") public String logs() < logger.trace("A TRACE Message"); logger.debug("A DEBUG Message"); logger.info("An INFO Message"); logger.warn("A WARN Message"); logger.error("An ERROR Message"); return "SUCCESS"; >>

Start the application and hit the URL: http://localhost:8080/logs and note the logs in console.

2021-12-24 14:00:16.880 INFO 2828 --- [nio-8080-exec-1] c.s.demo.web.LoggerController : An INFO Message 2021-12-24 14:00:16.880 WARN 2828 --- [nio-8080-exec-1] c.s.demo.web.LoggerController : A WARN Message 2021-12-24 14:00:16.880 ERROR 2828 --- [nio-8080-exec-1] c.s.demo.web.LoggerController : An ERROR Messa

As seen in the logged messages, the default logging level is preset to INFO . That’s why the TRACE and DEBUG messages are not visible.

3. Customizing Default Logging

3.1. Log Level

To enable debug or trace logs, we can start our application with a —debug or —trace flag.

Alternatively, we can set debug=true in application.properties file. This enables debug logging for a selection of core loggers (embedded container, Hibernate schema generation, and all spring modules).

For more fine-grained control over logging levels for different packages, we can make the application configuration level change in application.properties file.

logging.level.root=WARN logging.level.com.springexamples=DEBUG

Note that Logback does not have a FATAL level. If specified, it is mapped to ERROR.

3.2. Log Format

By default, spring boot prints color-coded logs which include the following information:

  • Date and Time
  • Log Level: ERROR, WARN, INFO, DEBUG, or TRACE
  • Process ID
  • A — separator
  • Thread name
  • Logger name: usually the class name
  • The log message

We can read the complete default configuration in defaults.xml.

To override the default log formats, we can provide the custom formats using the properties logging.pattern.console and logging.pattern.file.

logging.pattern.console= %d - %msg%n logging.file=$/application.log logging.pattern.file= %d [%thread] %-5level %logger - %msg%

3.3. File Logger

By default, Spring Boot logs only to the console and does not write log files.

To enable file logging, set the logging.file.name or logging.file.path properties. The default file log level is INFO, similar to console logging.

logging.file.path=$ logging.file.name=app.log

Note that file logs rotate when they reach 10 MB. If using Logback, we can customize the log rotation policy using the following properties.

  • logging.logback.rollingpolicy.file-name-pattern
  • logging.logback.rollingpolicy.clean-history-on-start
  • logging.logback.rollingpolicy.max-file-size
  • logging.logback.rollingpolicy.total-size-cap
  • logging.logback.rollingpolicy.max-history

For other logging frameworks, we need to configure loggers and rotation policies in their specific configuration files.

3.4. ANSI Color Coded Logs

Configure the value of spring.output.ansi.enabled property to customize the color-coded logs. The supported values are:

  • DETECT – detects whether ANSI coloring capabilities are available. This is the default behavior.
  • ALWAYS – always enables ANSI-colored output.
  • NEVER – completely disables ANSI-colored output.
spring.output.ansi.enabled=ALWAYS

4. Configuring Custom Logging

The default console and file logs are good for bootstrapping the application and simple POCs. As the application matures, we need to provide an extensive logging configuration to capture each kind of log with suitable rotation policies.

To configure the custom logging, we have the following options:

4.1. org.springframework.boot.logging.LoggingSystem Property

We can force Spring Boot to use a particular logging system by using the org.springframework.boot.logging.LoggingSystem system property. Its value should be the fully qualified class name of a LoggingSystem implementation.

  • none – disables the logging configuration entirely
  • org.springframework.boot.logging.log4j2.Log4J2LoggingSystem – configures Log4j2. Searches for a file named in sequence logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy.
  • org.springframework.boot.logging.logback.LogbackLoggingSystem – configures Logback. Searches for a file named in sequence log4j2-spring.xml or log4j2.xml.
  • org.springframework.boot.logging.java.JavaLoggingSystem – configures Java util logging. Searches for logging.properties.

Using the -spring variants for the logging configuration files is the recommended approach.

4.2. Exclude Logback

Another approach to configuring logging is to exclude Logback and include another logging framework such as Log4j2.

 org.springframework.boot spring-boot-starter-web  org.springframework.boot spring-boot-starter-logging    org.springframework.boot spring-boot-starter-log4j2 

This way Spring auto-detects the dependencies and configures the appropriate logging framework for us.

We still need to place the logging configuration file in the classpath. We can use the property logging.config to give the location of the configuration file, too.

logging.config=classpath:log4j2.properties

Note that if we are using the file name as listed in the previous section which Spring searches for, then we should provide the file name using logging.config property.

If we use log4j2.properties, then logging.config=classpath:log4j2.properties should be specified.

On the other hand, If we use log4j2-spring.xml, then there is no need to specify logging.config.

Also note that with such configuration, we are free to use native Log4j2 classes or SLF4J classes to write the log statements. Under the hood, Log4j2 will be used.

5. Logging with Lombok

Spring boot does not have inbuilt support for Lombok, so to use Lombok, we must include its dependency explicitly.

 org.projectlombok lombok 1.18.20 provided 

The recommended way is to use SLF4J APIs that act as an abstraction over other logging implementation frameworks. To do this, use @Slf4j annotation for the application classes.

The @Slf4j annotation automatically adds a field named log which we can use to write log statements.

@Slf4j @RestController public class LoggerController < @GetMapping ("/logs") public String logs() < log.trace("A TRACE Message"); log.debug("A DEBUG Message"); log.info("An INFO Message"); log.warn("A WARN Message"); log.error("An ERROR Message"); return "SUCCESS"; >>

Generate log statements again and note the console logs. Note that we have enabled the debug logging in previous steps.

2021-12-24 15:45:32.145 DEBUG 23356 --- [nio-8080-exec-1] c.s.demo.web.LoggerController : A DEBUG Message 2021-12-24 15:45:32.145 INFO 23356 --- [nio-8080-exec-1] c.s.demo.web.LoggerController : An INFO Message 2021-12-24 15:45:32.145 WARN 23356 --- [nio-8080-exec-1] c.s.demo.web.LoggerController : A WARN Message 2021-12-24 15:45:32.145 ERROR 23356 --- [nio-8080-exec-1] c.s.demo.web.LoggerController : An ERROR Message

6. Conclusion

In this Spring boot tutorial, we learn many things about boot-provided logging defaults and how to customize them properly. We also learned to use custom logging frameworks and provide more extensive logging configuration files.

You can check out the source code of these examples over Github.

Источник

Оцените статью