Введение в логбэк
Logback — это еще одна структура ведения журнала после log4j.Logback — это среда ведения журнала, которая поставляется с springboot.Logback различает журналы разных уровней со строгими уровнями журнала (другие журналы наследуют уровень журнала предыдущего уровня, например: log4j2, log4j оба должны наследовать журналы более высокого уровня), logback делится на три модуля, logback-core, logback-classic, logback-access.
- logback-core: logback-core — это основной модуль logback и основа logback-classic и logback-access.
- logback-classic: реализует API slf4j и может использоваться с slf4j для простого переключения на другие фреймворки журналов.
- logback-access: интегрируется с контейнерами сервлетов (такими как Tomcat и Jetty) и предоставляет интерфейс журнала доступа HTTP.
Springboot интегрирует журнал
Как я уже говорил, поскольку сам Springboot интегрирует logback, при интеграции logback требуются только собственные зависимости Springboot.
пом-зависимость
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
Конфигурация файла application.properties
logging.config=classpath:logback-spring.xml
Конфигурация файла logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds">
<property name="LOG_HOME" value="./WebAppLogs/logs"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n</pattern>
</encoder>
</appender>
<!-- trace日志 -->
<appender name="RollingFileTrace" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<file>${LOG_HOME}/trace.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 只接受trace级别的日志,因为logback有严格的日志区分,所以某一个分类的日志只包括该类型的日志 -->
<level>TRACE</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/trace_%d{yyyy-MM-dd-HH}-%i.log.zip</fileNamePattern>
<!-- 单个文件大小 -->
<maxFileSize>10 MB</maxFileSize>
<!--fileNamePattern的格式为yyyy-MM-dd-HH,则日志回收时间也应该与fileNamePattern相同 -->
<maxHistory>168</maxHistory>
<!--总得文件日志-->
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n</pattern>
<!--设置日志编码为utf-8-->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- debug日志 -->
<appender name="RollingFileDebug" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<file>${LOG_HOME}/debug.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/debug_%d{yyyy-MM-dd-HH}-%i.log.zip</fileNamePattern>
<!-- 单个文件大小 -->
<maxFileSize>10 MB</maxFileSize>
<!--fileNamePattern的格式为yyyy-MM-dd-HH,则日志回收时间也应该与fileNamePattern相同 -->
<maxHistory>168</maxHistory>
<!--总得文件日志-->
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n</pattern>
<!--设置日志编码为utf-8-->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- info日志 -->
<appender name="RollingFileInfo" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<file>${LOG_HOME}/info.log</file>
<!-- 只要info的日志的配置 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/info_%d{yyyy-MM-dd-HH}-%i.log.zip</fileNamePattern>
<!-- 单个文件大小 -->
<maxFileSize>10 MB</maxFileSize>
<!--fileNamePattern的格式为yyyy-MM-dd-HH,则日志回收时间也应该与fileNamePattern相同 -->
<maxHistory>168</maxHistory>
<!--总得文件日志-->
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n</pattern>
<!--设置日志编码为utf-8-->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- warn日志 -->
<appender name="RollingFileWarn" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<file>${LOG_HOME}/warn.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/warn_%d{yyyy-MM-dd-HH}-%i.log.zip</fileNamePattern>
<!-- 单个文件大小 -->
<maxFileSize>10 MB</maxFileSize>
<!--fileNamePattern的格式为yyyy-MM-dd-HH,则日志回收时间也应该与fileNamePattern相同 -->
<maxHistory>168</maxHistory>
<!--总得文件日志-->
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n</pattern>
<!--设置日志编码为utf-8-->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- error日志 -->
<appender name="RollingFileError" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<file>${LOG_HOME}/error.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/error_%d{yyyy-MM-dd-HH}-%i.log.zip</fileNamePattern>
<!-- 单个文件大小 -->
<maxFileSize>10 MB</maxFileSize>
<!--fileNamePattern的格式为yyyy-MM-dd-HH,则日志回收时间也应该与fileNamePattern相同 -->
<maxHistory>168</maxHistory>
<!--总得文件日志-->
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n</pattern>
<!--设置日志编码为utf-8-->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- app应用日志 -->
<appender name="RollingFileApp" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<file>${LOG_HOME}/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/app_%d{yyyy-MM-dd-HH}-%i.log.zip</fileNamePattern>
<!-- 单个文件大小 -->
<maxFileSize>10 MB</maxFileSize>
<!--fileNamePattern的格式为yyyy-MM-dd-HH,则日志回收时间也应该与fileNamePattern相同 -->
<maxHistory>168</maxHistory>
<!--总得文件日志-->
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n</pattern>
<!--设置日志编码为utf-8-->
<charset>UTF-8</charset>
</encoder>
</appender>
<logger name="org.springframework" level="info"/>
<!--使用日志继承属性 addtivity="false" -->
<logger name="com.javanorth" level="all" addtivity="true"/>
<root level="info">
<appender-ref ref="STDOUT"/>
<appender-ref ref="RollingFileTrace"/>
<appender-ref ref="RollingFileDebug"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
<appender-ref ref="RollingFileApp"/>
</root>
</configuration>
Конфигурация для записи всех журналов в один файл журнала
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds">
<property name="LOG_HOME" value="./WebAppLogs/logs"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n</pattern>
</encoder>
</appender>
<!-- app应用日志 -->
<appender name="RollingFileApp" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<file>${LOG_HOME}/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/app_%d{yyyy-MM-dd-HH}-%i.log.zip</fileNamePattern>
<!-- 单个文件大小 -->
<maxFileSize>10 MB</maxFileSize>
<!--fileNamePattern的格式为yyyy-MM-dd-HH,则日志回收时间也应该与fileNamePattern相同 -->
<maxHistory>168</maxHistory>
<!--总得文件日志-->
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%t表示线程名,%msg:日志消息,%n是换行符-->
<pattern>[%d{HH:mm:ss:SSS}] - [%t] [%p] - %logger{36} - %m%n</pattern>
<!--设置日志编码为utf-8-->
<charset>UTF-8</charset>
</encoder>
</appender>
<logger name="org.springframework" level="info"/>
<!--使用日志继承属性 addtivity="false" -->
<logger name="com.javanorth" level="all" addtivity="true"/>
<root level="info">
<appender-ref ref="STDOUT"/>
<appender-ref ref="RollingFileApp"/>
</root>
</configuration>
Реализовать логбэк через slf4j
public class LogUtil {
/**
* debug级别日志输出
* @param clazz 类
* @param msg 日志
* @param params 其他参数
*/
public static void debug(Class clazz, String msg, Object... params) {
Logger logger = LoggerFactory.getLogger(clazz.getName());
logger.debug(msg, params);
}
/**
* trace日志输出
* @param clazz 类
* @param msg 日志
* @param params 其他参数
*/
public static void trace(Class clazz, String msg, Object... params) {
Logger logger = LoggerFactory.getLogger(clazz.getName());
logger.trace(msg, params);
}
/**
* info级别日志输出
* @param clazz 类
* @param msg 日志
* @param params 其他参数
*/
public static void info(Class clazz, String msg, Object... params) {
Logger logger = LoggerFactory.getLogger(clazz.getName());
logger.info(msg, params);
}
/**
* warn级别日志输出
* @param clazz 类
* @param msg 日志
* @param params 其他参数
*/
public static void warn(Class clazz, String msg, Object... params) {
Logger logger = LoggerFactory.getLogger(clazz);
logger.warn(msg, params);
}
/**
* error级别日志输出
* @param clazz 类
* @param msg 日志
* @param params 其他参数
*/
public static void error(Class clazz, String msg, Object... params) {
Logger logger = LoggerFactory.getLogger(clazz);
logger.error(msg, params);
}
}
Вызовы реализованы slf4j
void contextLoads() {
LogUtil.info(this.getClass(), "this is info log");
}
вывод журнала
Суммировать
В целом logback немного уступает log4j2 по производительности в определенной степени, что также анализировалось в наших предыдущих статьях, но logback по-прежнему любим многими, лично я считаю, что конфигурация logback действительно проще, чем log4j2 и logback. log более упрощен, а требования к наследованию логов очень строгие, что в определенной степени облегчает поиск проблем и уменьшает количество ненужных логов.
Справочная статья
- [1].Использование logback и подробное объяснение logback.xml.блог woo woo woo.cn на.com/war king/fear/5….
- [2].logback веб-сайт.log back.QoS.eat/document ATI….