1、市面上的日志框架:JUL、JCL(Apache 基金会的)、Jboss-logging、logback、log4j、log4j2、slf4j…
日志门面(抽象层) | 日志实现 |
---|---|
JCL(Jakarta Commons Logging-属于Apache基金会)、jboss-logging | JUL(java.util.logging-Java JDK自带的) |
SLF4j(Simple Logging Facade for Java) | Log4j 、 Log4j2 、Logback |
2、其中 SLF4j 与 Log4j 、 Logback 出自同一人之手。Log4j2 是另外一个人并不是 Log4j 的升级版,只是借用了 Log4j 的名号而已,Logback 才是 Log4j 的升级版。
SLF4J Github 开源地址:https://github.com/qos-ch/slf4j
SLF4J 使用文档地址:https://www.slf4j.org/manual.html
1、SpringBoot 默认使用 SLF4j 和 Logback 记录日志。
2、开发的时候,为了应用日志系统的将来的扩展,日志记录方法的调用,不应该直接调用日志的实现类,而是调用日志抽象层里面的方法;这样以后即使更换了实现类也没有关系。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello World");
}
}
//////////////////////////////////////////////////
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class HelloWolrd {
public static void main(String[] args) {
// 日志的级别
// 由低到高:trace
// 通过此级别关系,我们可以通过调整日志的级别:日志就只会在这个级别以及以后的更高级别才生效。
log.trace("this is trace log...");
log.debug("this is debug log...");
log.info("this is info log...");
log.warn("this is warn log...");
log.error("this is error log...");
}
}
spring-boot中底层依赖:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
<version>2.1.4.RELEASEversion>
<scope>compilescope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-loggingartifactId>
<version>2.1.4.RELEASEversion>
<scope>compilescope>
dependency>
SpringBoot修改日志的默认配置:
logging.level=info
# 日志文件名
#logging.file=./springboot.log
# 在控制台输出的日志的格式
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
# 指定文件中日志输出的格式
logging.pattern.file=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
1、logback.xml:应用启动时会直接被日志框架 logback 识别而被使用,不经过Spring Boot,所以使用 logback.xml 作为日志配置文件,不能使用Spring Boot 的 Profile 高级功能。
2、logback-spring.xml:logback 日志框架就不能直接识别到,而会由 Spring Boot 解析此日志配置文件,从而可以使用Spring Boot 的 Profile 高级功能。
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>logbackcontextName>
<property name="log.path" value="./" />
<property name="info.fileName" value="info" />
<property name="debug.fileName" value="debug" />
<property name="warn.fileName" value="warn" />
<property name="error.fileName" value="error" />
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debuglevel>
filter>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
<charset>UTF-8charset>
encoder>
appender>
<appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/${info.fileName}.logfile>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
<charset>UTF-8charset>
encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/${info.fileName}-%d{yyyy-MM-dd}.%i.logfileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MBmaxFileSize>
timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>90maxHistory>
rollingPolicy>
appender>
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/${debug.fileName}.logfile>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
<charset>UTF-8charset>
encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/debug/${debug.fileName}-%d{yyyy-MM-dd}.%i.logfileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MBmaxFileSize>
timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>15maxHistory>
rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>debuglevel>
<onMatch>ACCEPTonMatch>
<onMismatch>DENYonMismatch>
filter>
appender>
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/${warn.fileName}.logfile>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
<charset>UTF-8charset>
encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/warn/${warn.fileName}-%d{yyyy-MM-dd}.%i.logfileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MBmaxFileSize>
timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>15maxHistory>
rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warnlevel>
<onMatch>ACCEPTonMatch>
<onMismatch>DENYonMismatch>
filter>
appender>
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/${error.fileName}.logfile>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
<charset>UTF-8charset>
encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/${error.fileName}-%d{yyyy-MM-dd}.%i.logfileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MBmaxFileSize>
timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>15maxHistory>
rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERRORlevel>
<onMatch>ACCEPTonMatch>
<onMismatch>DENYonMismatch>
filter>
appender>
<appender name="REQUEST" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/request.logfile>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
<charset>UTF-8charset>
encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/request-%d{yyyy-MM-dd}.%i.logfileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MBmaxFileSize>
timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>90maxHistory>
rollingPolicy>
appender>
<logger name="com.example.springbootprofile.controller" level="info">
<appender-ref ref="REQUEST"/>
logger>
<logger name="com.example.mapper" level="debug"/>
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE_ALL"/>
<appender-ref ref="DEBUG_FILE"/>
<appender-ref ref="WARN_FILE"/>
<appender-ref ref="ERROR_FILE"/>
root>
<springProfile name="dev">
<root level="info">
<appender-ref ref="CONSOLE"/>
root>
springProfile>
<springProfile name="prd">
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE_ALL"/>
<appender-ref ref="DEBUG_FILE"/>
<appender-ref ref="WARN_FILE"/>
<appender-ref ref="ERROR_FILE"/>
root>
springProfile>
configuration>
一、configuration 根节点
属性:
// scan : 配置文件如果发生改变,将会重新加载,默认值为true;
// scanPeriod : 检测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位时毫秒,当scan为true时,这个属性生效,默认时间间隔为1min。
// debug : 默认为false ,设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。
<configuration scan="true" scanPeriod="2" debug="true">
configuration>
基本结构:
多个 appender 元素,零个或多个 logger 元素,最多一个 root 元素。
二、appender 子节点
负责写日志的组件。
基本结构:
属性:
name:appender 名称;
class:指定 appender 的全限定名;
<configuration debug="true" scan="true" scanPeriod="2">
<appender name="console_out" class="ch.qos.logback.core.ConsoleAppender">
appender>
<appender name="file_out" class="ch.qos.logback.core.FileAppender">
appender>
<appender name="file_out" class="ch.qos.logback.core.RollingFileAppender">
appender>
<root>root>
<loger>loger>
configuration>
三、ConsoleAppender 日志输出到控制台
以下节点:
encoder : 对日志进行格式化。
target : 字符串System.out 或者 System.err, 默认 System.out;
<configuration>
<appender name="console_out" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
encoder>
appender>
<root level="INFO">
<appender-ref ref="console_out" />
root>
configuration>
四、FileAppender 日志添加到文件
有如下节点:
file : 被写入的文件名,可以是相对目录 , 也可以是绝对目录 , 如果目录不存在则会自动创建
append : 如果是true , 日志被追加到文件结尾 , 如果是false,清空现存文件 , 默认是true
encoder : 对日志进行格式化 [具体的转换符说明请参见官网.]
prodent : 如果是true,日志会被安全的写入文件 , 即使其他的FileAppender也会向此文件做写入操作 , 默认是false
<configuration>
<appender name="file_out" class="ch.qos.logback.core.FileAppender">
<file>logs/debug.logfile>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
encoder>
appender>
configuration>
参考:
logback节点配置详解
【Spring Boot】4.日志
logback介绍和配置详解
Logback配置使用