springboot整合日志
明白几个东西:
1.logging是jdk原生日志框架(一般不用)
2.log4j是Apache开源的日志框架,现在已经停了维护,但绝大数企业还是用的它
3.logback是log4j的一种该进
4.log4j2是重新完完整整被写的一个新的
一、springboot配置log4j2日志:
1.pom.xml文件
<!--排除自身依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<!-- 这个就是将含有spring-boot-starter开头的依赖的默认配置全排除掉,以后就用这个就不用去web下,
或其他那里再加这段 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency> <!-- 引入log4j2依赖 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
2.在resource下建立 log4j2.xml
代码:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO" monitorInterval="1800">
<properties>
<property name="LOG_HOME">/home/WorkStatLog</property><!-- D://WorkStatLog-Test /home/WorkStatLog-->
</properties>
<appenders>
<Console name="consolePrint" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n" charset="UTF-8" />
</Console>
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定(false为自动清除),这个也挺有用的,适合临时测试用-->
<File name="log" fileName="${LOG_HOME}/workStat.log" append="false"
filePattern="${LOG_HOME}/workStat-%d{yyyy-MM-dd}.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5level %class{36} %L %M - %msg%xEx%n" charset="UTF-8" />
</File>
<!--这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFiles" fileName="logs/workStatapp.log"
filePattern="${LOG_HOME}/logs/$${date:yyyy-MM}/workStatapp-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n" charset="UTF-8" />
<SizeBasedTriggeringPolicy size="20MB"/>
</RollingFile>
<!-- 每天产生一个日志文件 此路径最多产生20个,超过新的会覆盖旧的 -->
<!-- <RollingRandomAccessFile > filepattern 中的日期格式精确位数决定了生成日志的日期单位,
<TimeBasedTriggeringPolicy> interval 决定该单位下的间隔数,如果在上面例子中 interval 设置为 5,那么就是5天生成一个日志;
<DefaultRolloverStrategy max="20"/> 用于设置符合同个filePath的日志文件的最大数量 ,默认为7 -->
<RollingRandomAccessFile name="RollingFile" fileName="${LOG_HOME}/workStatApp.log"
filePattern="${LOG_HOME}/workStatApp-%d{yyyy-MM-dd}.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n" charset="UTF-8" />
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
</Policies>
<DefaultRolloverStrategy max="30"/>
</RollingRandomAccessFile>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<logger name="com.lhy.workstat.*" level="trace" additivity="false">
<appender-ref ref="RollingFile"/>
<appender-ref ref="RollingFiles"/>
<appender-ref ref="log"/>
<appender-ref ref="consolePrint"/>
</logger>
<!--建立一个默认的root的logger-->
<root level="info">
<appender-ref ref="RollingFile"/>
<appender-ref ref="RollingFiles"/>
<appender-ref ref="log"/>
<appender-ref ref="consolePrint"/>
</root>
</loggers>
</Configuration>
启动结果:
二、sprinboot配置log4j2框架(也是一种参考)
1.pom.xml
<!--排除自身依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<!-- 这个就是将含有spring-boot-starter开头的依赖的默认配置全排除掉,以后就用这个就不用去web下,
或其他那里再加这段 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency> <!-- 引入log4j2依赖 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
2.代码:
建立log4j2.xml:主要注意下面路径看在E:/下生产成log文件夹,包括三个文件
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
<configuration status="WARN" monitorInterval="30">
<properties>
<!--<property name="FILE_PATH" value="更换为你的日志路径" />
<property name="FILE_NAME" value="更换为你的项目名" /-->
<property name="LOG_HOME">E:/</property>
</properties>
<!--先定义所有的appender-->
<appenders>
<!--这个输出控制台的配置-->
<console name="Console" target="SYSTEM_OUT">
<!--输出日志的格式-->
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%p] - %l - %m%n"/>
</console>
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
<File name="log" fileName="log/test.log" append="false">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/logs/info.log"
filePattern="${LOG_HOME}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
<RollingFile name="RollingFileWarn" fileName="${LOG_HOME}/logs/warn.log"
filePattern="${LOG_HOME}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
<DefaultRolloverStrategy max="20"/>
</RollingFile>
<RollingFile name="RollingFileError" fileName="${LOG_HOME}/logs/error.log"
filePattern="${LOG_HOME}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
<logger name="org.springframework" level="INFO"></logger>
<logger name="org.mybatis" level="INFO"></logger>
<root level="all">
<appender-ref ref="Console"/>
<appender-ref ref="log"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
</root>
</loggers>
</configuration>
在yml配置:
logging:
config: classpath:log4j2.xml
结果:
三、springboot配置logback
springBoot集成了logBack日志框架,不需要去添加依赖,如果是被排除了,可以添加如下依赖试试。
1.pom.xml<!--https://mvnrepository.com/artifact/log4j/log4j--><!--应该是logback的依赖--><!--<dependency>-->
<!--<groupId>log4j</groupId>-->
<!--<artifactId>log4j</artifactId>-->
<!--<version>1.2.17</version>-->
<!--</dependency>-->
logBack包含三个模块:logback-core,logback-classic和logback-access。logback-core是核心模块,其它两个模块基础
logback-classic是log4j的一个
改良版本,并且完整实现了SLF4J api。logback-access是提供和web容器访问的日志功能。
故我们在springboot中代码中直接使用slf4j的接口来进行日志打印,没有引用任何logback的代码,就完成了logback的调用,
我们只需要使用如下形式即可。
1、用lombok插件,只要在类上用一个@slf4j注解既可使用log变量来打印,如果log变量不能用,idea中去加入插件。导入为
import lombok.extern.slf4j.Slf4j;
2、自己在类中定义:private final Logger logger = LoggerFactory.getLogger(类名.class);
导入为:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
这样就可以用logger变量来打印。
logback配置简单介绍
i1、配置中重要三要素: Logger、appender、layout
Logger:日志的记录器,通过LogContext进行管理,存放Logger对象。
appender:日志输出目的地,控制台,文件,数据库。
layout:日志输出的格式。
i2、日志级别
经常用的:error>warn>info>debug>trace
2.logback配置需求:
需求:分别在controller包和service包的日志,分别输出到两个日志文件下,其他输出到另一个日志文件(root下)
明白property标签,appender标签,logger标签,root标签和其中一些属性的意思。
3.配置代码:
<?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都是设置参数,给后面用,如${LOG_PATH} el表达式使用} -->
<!--保存日志的文件目录位置,这里相对在项目路径,项目发布肯定要改位置-->
<property name="LOG_PATH" value="log"/>
<!--打印到日志文件的日期格式-->
<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设置日志的输出目的地,有console,文件,数据库,是哪种看class -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名,看到这里/就是代表每级别目录-->
<fileNamePattern>${LOG_PATH:-}/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 每个日志文件的大小 -->
<maxFileSize>100MB</maxFileSize>
<!-- 保留多少天的日志 -->
<MaxHistory>30</MaxHistory>
<!--每天最大日志量 超过这个量日志文件就会诶被回滚覆盖-->
<maxFileSize>2GB</maxFileSize>
</rollingPolicy>
<encoder>
<!--日志文件里的格式-->
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<!--controller日志的位置-->
<appender name="CONTROLLER-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>
${LOG_PATH:-}/%d{yyyy-MM-dd}/controller/%d{yyyy-MM-dd}-controller.%i.log
</fileNamePattern>
<!-- 每个日志文件的大小 -->
<maxFileSize>100MB</maxFileSize>
<!-- 保留多少天的日志 -->
<MaxHistory>30</MaxHistory>
<!--每天最大日志量 超过这个量日志文件就会诶被回滚覆盖-->
<maxFileSize>2GB</maxFileSize>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<!--service日志-->
<appender name="SERVICE-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>
${LOG_PATH:-}/%d{yyyy-MM-dd}/service/%d{yyyy-MM-dd}-service.%i.log
</fileNamePattern>
<!-- 每个日志文件的大小 -->
<maxFileSize>100MB</maxFileSize>
<!-- 保留多少天的日志 -->
<MaxHistory>30</MaxHistory>
<!--每天最大日志量 超过这个量日志文件就会诶被回滚覆盖-->
<maxFileSize>2GB</maxFileSize>
</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标签和root标签
logger标签(非必须项,看自己项目需要,要不要给某个类专门打印不一样的日志):
作用:给不同的包,类使用不同的配置,意思是只打印该包下或者该类下的日志到指定的文件
name:指定不同的包或者类,
appender-ref:输出到指定的文件
additivity: false表示不继承 不写默认为true ,继承的话就会使用根root来输出,就会重复输出。
level :表示日志级别
因为你自己定义了一个输出,继承了根,根也输出,就重复了。
root标签(必须项,如果不配置,啥也不打印)
当配置了logger时,如果运行到了该包或者该类中,则会使用logger中指定地方输出日志,而不会传递给上级root,也就是
该类日志输出到指定地方,而不会输出到root指定的地方,因为设置了additivity为false。如果为true,则都会输出。
需求:分别在controller包和service包的日志,分别输出到两个日志文件下,其他输出到另一个日志文件(root下)
-->
<!--controller包-->
<logger level="info" name="com.yiyezhiqiu.redis_study01.controller" additivity="false">
<appender-ref ref="CONTROLLER-APPENDER"/>
<appender-ref ref="CONSOLE"/>
</logger>
<!-- service包 -->
<logger level="info" name="com.yiyezhiqiu.redis_study01.service" additivity="false">
<appender-ref ref="SERVICE-APPENDER"/>
<appender-ref ref="CONSOLE"/>
</logger>
<!--这些可能是为mybatis定制,但感觉意义不大,删除都没关系-->
<!--
<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>
-->
<!--
这里设置级别则会打印出该包括该级别以上的日志,log.info,log,warn,log.error都可以输出
但log.trace,log.debug不会输出。
而且这个必须要,不然就不会在控制台打印和输出任何日志。
-->
<root level="info" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
结果:
以前单个文件的代码:(可以废掉)
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="d:/logback" />
<!-- 控制台输出 -->
<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{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<Prudent>true</Prudent>//这行后面加的
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>100MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- show parameters for hibernate sql 专为 Hibernate 定制 -->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
<!--myibatis log configure-->
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
<!--日志异步到数据库 -->
<!--<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">-->
<!--<!–日志异步到数据库 –>-->
<!--<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">-->
<!--<!–连接池 –>-->
<!--<dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">-->
<!--<driverClass>com.mysql.jdbc.Driver</driverClass>-->
<!--<url>jdbc:mysql://127.0.0.1:3306/databaseName</url>-->
<!--<user>root</user>-->
<!--<password>root</password>-->
<!--</dataSource>-->
<!--</connectionSource>-->
<!--</appender>-->
</configuration>
结果:
![](https://img2018.cnblogs.com/i-beta/1862889/202001/1862889-20200110171135202-370449324.png)