通常情况下,日志是由一个抽象层+实现层的组合来搭建的。
- 抽象层:JCL(Jakarta Commons Logging)、SLF4j(Simple Logging Facade for Java)、jboss-logging
- 实现层:Log4j 、JUL(java.util.logging)、Log4j2、Logback
应用中不可直接使用日志系统(Log4j 、Logback)中的 API ,而应使用日志框架 SLF4J 中的 API 。使用门面模式的日志框架,有利于维护和各个类的日志处理方式的统一。SpringBoot 默认是 SLF4J + Logback 的组合。
1. application.yml
在配置文件中对日志级别和文件路径进行配置。
logging:
level:
com.shpun: debug
file:
path: ./log
2. logback-spring.xml
自定义配置,在resources目录下创建文件logback-spring.xml。
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="logs" />
<!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%level表示级别,%thread表示线程名,%logger表示类名,%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5level ---[%15.15thread] %-40.40logger{39} : %m%n</pattern>
</encoder>
</appender>
<!-- 按照DEBUG每天生成日志文件 -->
<appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/debug.log</file>
<!--过滤掉低于DEBUG的日志-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/debug.log.%d{yyyy-MM-dd}.%i</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>7</MaxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 或者文件大小大于100M -->
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%level表示级别,%thread表示线程名,%logger表示类名,%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5level ---[%15.15thread] %-40.40logger{39} : %m%n</pattern>
</encoder>
</appender>
<!-- 按照INFO每天生成日志文件 -->
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/info.log</file>
<!--过滤掉低于INFO的日志-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/info.log.%d{yyyy-MM-dd}.%i</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>7</MaxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 或者文件大小大于100M -->
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%level表示级别,%thread表示线程名,%logger表示类名,%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5level ---[%15.15thread] %-40.40logger{39} : %m%n</pattern>
</encoder>
</appender>
<!-- 按照ERROR每天生成日志文件 -->
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/error.log</file>
<!--过滤掉低于ERROR的日志-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/error.log.%d{yyyy-MM-dd}.%i</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>7</MaxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 或者文件大小大于100M -->
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%level表示级别,%thread表示线程名,%logger表示类名,%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5level ---[%15.15thread] %-40.40logger{39} : %m%n</pattern>
</encoder>
</appender>
<!-- 包com.shpun下 日志输出级别为DEBUG,不向上级root传递 -->
<logger name="com.shpun" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE" />
<appender-ref ref="INFO" />
<appender-ref ref="ERROR" />
<appender-ref ref="DEBUG" />
</logger>
<!-- 根logger 日志输出级别为INFO -->
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="INFO" />
<appender-ref ref="ERROR" />
</root>
</configuration>
configuration
debug:默认值为false。当为true时,将打印出Logback内部日志信息,实时查看logback运行状态。
contextName
上下文名称,默认为default。每个logger都关联到上下文,用于区分不同应用程序的记录。
property
定义变量值,可以使${name}
来使用变量。
appender
写日志的组件。
- ConsoleAppender:把日志添加到控制台;
- FileAppender:把日志添加到文件;
- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。
logger
用来设置某一个包或者具体的某一个类的日志打印级别以及指定appender。
root
根logger。
参考:
架构师必备,带你弄清混乱的JAVA日志体系!
SpringBoot - 日志的配置和使用详解(SLF4j、Logback)
SpringBoot优雅地配置日志
Logback 官方文档
logback 配置详解(一)——logger、root