声明:本博客内容,均根据网络上的博客内容汇总而成,其中大部分内容以及在项目中进行验证和测试。主要参考文章,在文末以及注明。
在SpringBoot中,底层是Spring框架,Spring框架默认使用JCL,而SpringBoot默认集成的日志框架使用的是SLF4j+Logback组合。
因为spring-boot-starter-logging是Logback的日志实现,而Spring Boot启动项spring-boot-starter又依赖了spring-boot-starter-logging,所以Spring Boot就默认集成了Logback。
SpringBoot默认集成了Logback,可以开箱即用,非常方便。在基于SpringBoot实现的系统中,使用SLF4j方法如下:
日志记录方法的调用,不应该来直接调用日志的实现类,而是应该调用日志抽象层的方法,即直接使用SLF4j日志门面。
在代码中使用的方式如下:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogDemo{
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(LogDemo.class);
logger.info("Hello World");
}
}
默认情况下,SpringBoot内部使用logback作为系统日志实现的框架,将日志输出到控制台,不会写到日志文件。如果在application.properties或application.yml配置,这样只能配置简单的场景,保存路径、日志格式等。复杂的场景(区分 info 和 error 的日志、每天产生一个日志文件等)满足不了,只能自定义配置文件logback-spring.xml。
在resources文件夹下创建logback.xml,logback会自动在该目录下加载该配置文件,在该文件中对打印日志的级别、形式、保存路径等进行配置。
logback配置文件如下所示,我们分别介绍每个节点和属性的意义和用法。
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<property name="CONSOLE_LOG_PATTERN" value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%level){blue} %clr(${PID}){magenta} %clr([%thread]){orange} %clr(%logger){cyan} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
<property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
<property name="DEV_FILE_PATH" value="./logs" />
<property name="PRO_FILE_PATH" value="/opt/prod/logs" />
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}pattern>
encoder>
appender>
<appender name="fileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%npattern>
encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${DEV_FILE_PATH}/output-%d{yyyy-MM-dd}.logfileNamePattern>
<maxFileSize>10MBmaxFileSize>
<maxHistory>60maxHistory>
a
<totalSizeCap>2GBtotalSizeCap>
rollingPolicy>
appender>
<appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERRORlevel>
filter>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%npattern>
encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${DEV_FILE_PATH}/error-%d{yyyy-MM-dd}.logfileNamePattern>
<maxFileSize>10MBmaxFileSize>
<maxHistory>60maxHistory>
<totalSizeCap>2GBtotalSizeCap>
rollingPolicy>
appender>
<springProfile name="dev">
<root level="INFO">
<appender-ref ref="consoleAppender" />
<appender-ref ref="fileAppender" />
<appender-ref ref="errorAppender" />
root>
springProfile>
<springProfile name="pro">
<root level="INFO">
<appender-ref ref="consoleAppender" />
<appender-ref ref="fileAppender" />
<appender-ref ref="errorAppender" />
root>
springProfile>
configuration>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
configuration 根节点包含的属性:
contextName:日志名,可以使用%contextName来引用。
<contextName>logback-spring-demo-devcontextName>
如果同时存在logback.xml和logback-spring.xml,或者同时存在logback.xml和自定义的配置文件,则会先加载logback.xml,再根据application配置加载指定配置文件,或加载logback-spring,xml。如果这两个配置文件的contextName不同,就会报错:
ERROR in ch.qos.logback.classic.joran.action.ContextNameAction - Failed to rename context [logback-demo] as [logback-spring-demo-dev] java.lang.IllegalStateException: Context has been already given a name
property标签可用于自定义属性,比如定义一个,然后使用${LOG_HOME}去引用它。
<property name="log.level" value="debug"/>
<property name="log.maxHistory" value="30"/>
<property name="log.filePath" value="${catalina.base}/logs/webapps"/>
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{50} >> %msg%n"/>
是负责写日志的组件,在这里可以理解为一个日志的渲染器,比如console日志选择器、文件渲染器。有两个必要属性name和class:
appender日志输出方式实现类:ConsoleAppender、FileAppender、RollingFileAppender、SocketAppender、SMTPAppender、DBAppender、SyslogAppender、SiftingAppender等.
平时主要使用的是ConsoleAppender和RollingFileAppender,其中ConsoleAppender是往控制台打印日志,RollingFileAppender是往磁盘文件追加日志,而且可以按照一定的设置方式动态分割日志。
控制台输出–ConsoleAppender
<property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERRORlevel>
filter>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}pattern>
encoder>
appender>
ThresholdFilter为系统定义的拦截器,例如我们用ThresholdFilter来过滤掉ERROR级别以下的日志不输出到文件中。如果不用记得注释掉,不然你控制台会发现没日志。
encoder表示输出格式,具体说明如下:
%d表示时间
%thread表示线程名
%-5level 表示日志级别,允许以五个字符长度输出
%logger{50}表示具体的日志输出者,比如类名,括号内表示长度
%msg表示具体的日志消息,就是logger.info("xxx")中的xxx
%n表示换行
%color(xxx)来指定对应列的输出颜色,可以实现控制台输出的颜色高亮
<property name="pattern-color" value="%yellow(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %green(%logger{50}) - %highlight(%msg) %n"/>
<appender name="CONSOLE-WITH-COLOR" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern-color}pattern>
encoder>
appender>
文件输入RollingFileAppender
文件输出主要包括配置:以指定格式将日志输出到指定文件夹下的文件中,可以配置该文件的名称、最大大小、保存时间等。
<property name="LOG_HOME" value="logs"/>
<property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n"/>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/all.%d.%i.logfileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MBmaxFileSize>
timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30maxHistory>
rollingPolicy>
<encoder>
<pattern>${pattern}pattern>
encoder>
appender>
上述配置的主要内容是:以指定的格式向logs文件下的文件输出日志,文件名称格式被指定为logs/all.日期.索引号.log,日志文件最大大小为10MB,超出则创建新文件,日志文件保留三十天。索引从0开始递增,rollingPolicy指滚动粗略,具体配置如上。关于日志文件大小限制也可以使用1GB配置。
root节点实际上是配置启用哪种appender,可以添加多个appender。
<root level="INFO">
<appender-ref ref="CONSOLE-WITH-COLOR"/>
<appender-ref ref="FILE"/>
root>
按照这样配置,表示level为info级别,启用渲染器CONSOLE-WITH-COLOR和FILE,输出日志时,控制台会按照CONSOLE定义的格式输出,而日志文件会按照CONSOLE-WITH-COLOR的配置去输出。
<logger name="com.apple.controller.TestController2" level="info" additivity="false">
<appender-ref ref="CONSOLE"/>
logger>
SpringBoot官方建议使用logback-spring.xml作为logback框架的自定义日志配置文件,使用logback-spring.xml而不是logback.xml,因为带-spring后缀的配置文件可以使用使用Spring扩展profile支持,提供profile多环境日志输出得功能。
Logback 配置文件中的 节点指令允许您根据配置文件激活参数(active) 选择性的包含和排查部分配置信息。根据不同环境来定义不同的日志输出,在 logback-spring.xml中使用 节点来定义,方法如下:
<springProfile name="dev">
<logger name="com.hs" level="debug" />
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
root>
springProfile>
<springProfile name="pro">
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="ERROR_FILE" />
<appender-ref ref="WARN_FILE" />
root>
springProfile>
https://blog.csdn.net/u013978512/article/details/117898022
https://blog.csdn.net/belongtocode/article/details/108451092