Сегодня будем подключать логер SLF4J к написанному ранее проекту Spring Boot и Thymeleaf JAR.
SLF4J (Simple Logging Facade for Java) — библиотека для протоколирования, ставящая своей целью предоставить максимально простой, но при этом мощный фасад для различных систем протоколирования на Java.
1. Структура каталогов
2. Зависимости
По умолчанию SLF4j уже включен в стартовый пакет Spring Boot
|
1 2 3 4 5 6 7 8 9 10 11 |
[INFO] Scanning for projects... [INFO] ... [INFO] +- org.springframework.boot:spring-boot-starter-thymeleaf:jar:1.5.9.RELEASE:compile [INFO] | +- org.springframework.boot:spring-boot-starter:jar:1.5.9.RELEASE:compile [INFO] | | +- org.springframework.boot:spring-boot-starter-logging:jar:1.5.9.RELEASE:compile [INFO] | | | +- ch.qos.logback:logback-classic:jar:1.1.11:compile [INFO] | | | | \- ch.qos.logback:logback-core:jar:1.1.11:compile [INFO] | | | +- org.slf4j:jcl-over-slf4j:jar:1.7.25:compile [INFO] | | | +- org.slf4j:jul-to-slf4j:jar:1.7.25:compile [INFO] | | | \- org.slf4j:log4j-over-slf4j:jar:1.7.25:compile |
3. Настройка через application.properties
Что бы включить логирование, создадим application.properties файл в корне папки resources.
3.1 logging.level – определяет уровень логирования, все логи будут выводиться в консоль.
|
1 2 |
logging.level.org.springframework.web=ERROR logging.level.ru.leodev=DEBUG |
3.2 logging.file – определяет имя файла для логирования, логи будут писаться как в консоль так и в файл одновременно
|
1 2 3 4 5 6 7 8 9 10 11 |
logging.level.org.springframework.web=ERROR logging.level.ru.leodev=DEBUG #создаст файл app.log в папке temp logging.file=${java.io.tmpdir}/app.log #создаст файл app.log в папке logs Tomcat сервера #logging.file=${catalina.home}/logs/app.log #создаст файл app.log по указанному пути #logging.file=/Users/leo/app.log |
[stextbox id=’warning’]System.getProperty(«java.io.tmpdir») — возвращает путь к временному каталогу операционной системы, да вот с небольшой помаркой!!!
Windows: «C:\Windows\Temp\»
Linux: «/tmp»
Обратите внимание — в первом случае завершающий слеш есть, а во втором — слеша нет, что требует дополнительной проверки в коде[/stextbox]
3.3 logging.pattern – определяет собственные правила(шаблон) ведения журнала
|
1 2 3 4 5 6 7 8 9 10 |
logging.level.org.springframework.web=ERROR logging.level.ru.leodev=DEBUG # паттерн логов для консоли logging.pattern.console= "%d{yyyy-MM-dd HH:mm:ss} - %msg%n" # паттерн логов для записи в файл logging.pattern.file= "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" logging.file=/Users/leo/app.log |
4. application.yml
Аналогичный пример в формате
|
1 2 3 4 5 6 7 8 |
logging: level: org.springframework.web: ERROR ru.leodev: DEBUG pattern: console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n" file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" file: /Users/leo/app.log |
5. Стандартный Logback.xml
Если не нравится шаблон логирования который предлагает Spring Boot, просто создаем стандартный файл logback.xml в корневой папке resources или корне classpath. Это переопределит шаблон логгера Spring Boot.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?xml version="1.0" encoding="UTF-8"?> <configuration> <property name="DEV_HOME" value="c:/logs" /> <appender name="FILE-AUDIT" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${DEV_HOME}/debug.log</file> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <Pattern> %d{yyyy-MM-dd HH:mm:ss} - %msg%n </Pattern> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- rollover daily --> <fileNamePattern>${DEV_HOME}/archived/debug.%d{yyyy-MM-dd}.%i.log </fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>10MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> </appender> <logger name="ru.leodev" level="debug" additivity="false"> <appender-ref ref="FILE-AUDIT" /> </logger> <root level="error"> <appender-ref ref="FILE-AUDIT" /> </root> </configuration> |
6. Логирование в Spring Boot + Profile
[stextbox id=’info’]Подробнее в Profile-specific configuration[/stextbox]
Создаем logback-spring.xml в корне classpath, это даст нам возможность использовать фичи шаблонов от Spring Boot.
В примере ниже:
- Если профиль dev, пишем в консоль и файл;
- Если профиль prod, пишем только в файл;
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
<?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/defaults.xml"/> <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/> <springProfile name="dev"> <include resource="org/springframework/boot/logging/logback/console-appender.xml"/> <appender name="ROLLING-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <encoder> <pattern>${FILE_LOG_PATTERN}</pattern> </encoder> <file>${LOG_FILE}</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.log</fileNamePattern> </rollingPolicy> </appender> <root level="ERROR"> <appender-ref ref="CONSOLE"/> <appender-ref ref="ROLLING-FILE"/> </root> </springProfile> <springProfile name="prod"> <appender name="ROLLING-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <encoder> <pattern>${FILE_LOG_PATTERN}</pattern> </encoder> <file>${LOG_FILE}</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>10MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> </appender> <root level="ERROR"> <appender-ref ref="ROLLING-FILE"/> </root> </springProfile> </configuration> |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
spring: profiles: active: prod logging: level: ROOT: ERROR org.springframework: ERROR org.springframework.data: ERROR ru.leodev: INFO org.mongodb: ERROR file: /Users/leo/app.log |
Для не веб приложений можно переопределить логгер через аргументы при запуске приложения
|
1 |
$ java -Dlogging.file=/home/leo/app/logs/app.log -jar springApp.jar |
5. Установка Root Level
Бывают ситуации когда места на серверах довольно мало, у меня была подобная ситуация с приложением у одного африканского банка. Мы можем ограничить уровень логирования
|
1 2 |
# root logging level, warning : too much output logging.level.=DEBUG |
И по аналогии YAML
|
1 2 3 |
logging: level: ROOT: DEBUG |

Тема не раскрыта. Как новичку не понятно как применить это. Одни конфиги расписали, а примера из кода нету.
А никто тут и не пишет для новичков или олдскульных разрабов.
Это всего лишь мои заметки для меня. Помогли — отлично, нет — бывает.
А не подскажите, как писать логи в файл только те которые мне нужны, а не весь журнал спрингбута, то есть только то что я сам захочу через LOGGER. info() например
логгер можно настраивать по пакетам
logging.level.root=WARN
logging.level.org.springframework=WARN
logging.level.it.tdlight.client=WARN
#logging.level.org.springframework.messaging=TRACE
#logging.level.org.springframework.web.socket=TRACE
logging.level.org.telegram.abilitybots=WARN
logging.level.ru.leodev.stoks.telegram.client=DEBUG
logging.level.org.hibernate.SQL=debug
logging.level.com.zaxxer.hikari.HikariConfig=info
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=WARN
logging.file.name=log/lds-tg-client.log
logging.charset.file=UTF-8
logging.charset.console=UTF-8