3.SpringBoot日志(日志框架,日志配置)
1. 日志框架
左边选择一个门面,(抽象层). 右边选择一个实现 .
日志门面:我们选择左边SLF4j,因为JCL太老了, jboss-logging不适合
日志实现:Logback最新的和SLF4j和SLF4j适配, log4j2适配不好
springboot:底层使用的spring框架,spring框架默认使用jcl
所以springboot使用slf4j和logback!
SLF4j的使用
1.如何在系统中使用SLF4j
以后在开发的时候,日志记录方法的调用,不应该嗲用日志的实现类, 而是调用抽象方法
给系统导入slf4j的jar和logback的实现jar
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");
}
}
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");
}
}
图示:slf4j用法
每一个日志实现框架,都有自己的配置文件. 配置文件使用slf4j以后,配置文件还是做成日志实现框架的配置文件;
2.遗留问题
统一日志记录,(Spring(commons-logging),Hibernate(joss-logging))
-
现将系统中其他日志框架先排除出去;
-
用中间包来替换原有的日志框架;
-
我们导入slf4j其他的实现
3.使用日志
Logger logger = LoggerFactory.getLogger(getClass());
// 日志的级别从低到高,如下排列
@Test
public void testLog() {
logger.trace("这个trace日志");
logger.debug("这个debug日志");
logger.info("这个info日志");
logger.warn("这个warn日志");
logger.error("这个error日志");
}
Logger logger = LoggerFactory.getLogger(getClass());
// 日志的级别从低到高,如下排列
@Test
public void testLog() {
logger.trace("这个trace日志");
logger.debug("这个debug日志");
logger.info("这个info日志");
logger.warn("这个warn日志");
logger.error("这个error日志");
}
可以在配置文件里配置级别:(如下图,这样我们的输出级别就是debug级别了)
logging.level=debug
#指定目录,与logging.file冲突
#当前磁盘的根路径下创建spring文件夹和里面的log文件夹,使用日志spring.log默认文件
logging.path=/spring/log
#不指定路径,就在当前项目下生产springboot.log日志
#可以指定完整的路径:
logging.file=springboot.log
# 在控制台输出的日志的格式
logging.pattern.console=
logging.level=debug
#指定目录,与logging.file冲突
#当前磁盘的根路径下创建spring文件夹和里面的log文件夹,使用日志spring.log默认文件
logging.path=/spring/log
#不指定路径,就在当前项目下生产springboot.log日志
#可以指定完整的路径:
logging.file=springboot.log
# 在控制台输出的日志的格式
logging.pattern.console=
指定配置
给类路径下 ,根据规定放一下的配置文件
Logging System | Customization |
---|---|
Logback | logback-spring.xml , logback-spring.groovy , logback.xml , or logback.groovy |
Log4j2 | log4j2-spring.xml or log4j2.xml |
JDK (Java Util Logging) | logging.properties |
推荐使用带扩展名的logback-spring.xml, 因为日志框架就不会被直接加载了,这样它由spirngboot加载能用到,springProfile标签,
生产使用的模板配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<jmxConfigurator/>
<springProperty scope="context" name="springAppName" source="spring.application.name"/>
<property name="LOG_PATH" value="/data/logfiles"/>
<property name="FILE_LOG_PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID:-} --- [%15.15t] %-40.40logger{39} : %m%n"
/>
<property name="CONSOLE_LOG_PATTERN"
value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) {faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"
/>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH:-}/${springAppName}/${springAppName}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH:-}/${springAppName}/${springAppName}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 每个日志文件的大小 -->
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 保留多少天的日志 -->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<!--错误日志的位置-->
<appender name="ERROR-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH:-}/${springAppName}/error/${springAppName}-error.log</file>
<param name="append" value="true"/>
<param name="threshold" value="WARN"/>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH:-}/${springAppName}/error/${springAppName}-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 每个日志文件的大小 -->
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 保留多少天的日志 -->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<!--第三方的日志-->
<appender name="THIRD-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH:-}/${springAppName}/third/${springAppName}-third.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH:-}/${springAppName}/third/${springAppName}-third-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 每个日志文件的大小 -->
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 保留多少天的日志 -->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<!--remote的日志-->
<appender name="REMOTE-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH:-}/${springAppName}/remote/${springAppName}-remote.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH:-}/${springAppName}/remote/${springAppName}-remote-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 每个日志文件的大小 -->
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 保留多少天的日志 -->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<!--流程的日志-->
<appender name="PROCESS-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH:-}/${springAppName}/process/${springAppName}-process.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH:-}/${springAppName}/process/${springAppName}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 每个日志文件的大小 -->
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 保留多少天的日志 -->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- 三方 -->
<logger name="THIRD" additivity="false">
<level value="${log_level}" />
<appender-ref ref="THIRD-APPENDER" />
<appender-ref ref="ERROR-APPENDER" />
<appender-ref ref="CONSOLE"/>
</logger>
<!-- 远程 -->
<logger name="REMOTE" additivity="false">
<level value="${log_level}" />
<appender-ref ref="REMOTE-APPENDER" />
<appender-ref ref="ERROR-APPENDER" />
<appender-ref ref="CONSOLE"/>
</logger>
<!-- 流程 -->
<logger name="PROCESS" additivity="false">
<level value="${log_level}" />
<appender-ref ref="PROCESS-APPENDER" />
<appender-ref ref="ERROR-APPENDER" />
<appender-ref ref="CONSOLE"/>
</logger>
<!-- 错误 -->
<logger name="ERROR" additivity="false">
<level value="WARN" />
<appender-ref ref="ERROR-APPENDER" />
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="druid.sql.Statement" level="INFO" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</logger>
<logger name="java.sql.PreparedStatement" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</logger>
<logger name="com.zjrc" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</logger>
<logger name="org.springframework" level="INFO" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</logger>
<logger name="org.springframework.cloud.sleuth.instrument.web.client.feign" level="INFO" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</logger>
<root level="INFO" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>