目录
前言:
一、先添加pom.xml 依赖
二、log4j2.xml 配置
三、application.yml
四、加几条测试日志
五、采用注解@log4j2
1、log4j2.xml 配置
2、测试类编辑
启动项目,
编辑
六、打印多个不同日志文件日志
1、log4j2.xml 配置
2、测试类
前言:
接着上面实战02讲,连上数据库以后肯定是希望可打印日志的.说明一下常用的日志方法
logbak其实可以说是 Log4J 的进化版,解决了Log4j无法用占位符的问题。
log4j2是重写之后性能比较好的。
slf4j 比较方便,由于他是抽象层,不能单独使用,需要配合其他日志的使用,这样就可以很好的集成其他日志,不用频繁地去切换日志的配置。
log4j2 应用是最广泛的,所以我们也采用它。
一、先添加pom.xml 依赖
<!-- exclude掉spring-boot的默认log配置 ,不然会报包冲突错误-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入log4j2依赖 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.19.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.19.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.19.0</version>
</dependency>
二、log4j2.xml 配置
<?xml version="1.0" encoding="UTF-8" ?>
<Configuration monitoringInterval="3600" shutdownHook="disable">
<Properties>
<!--日志目录-->
<Property name="basedir">logs/server</Property>
<!--日志名称-->
<Property name="all-logger">all-logger</Property>
</Properties>
<Appenders>
<!--控制台输出-->
<Console name="console" target="SYSTEM_OUT">
<!--日志样式pattern-->
<PatternLayout pattern="%highlight{[%d{yyyy-MM-dd HH:mm:ss.SSS}] - [%p] - [%c:%L] - [Method = %M] - [%m]}%n"/>
</Console>
<!--全部日志输出-->
<!--RollingFile实现日志文件滚动更新-->
<RollingFile name="${all-logger}" fileName="${basedir}/${all-logger}.log" append="true" filePattern="${basedir}/$${date:yyyy-MM}/${all-logger}-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="%highlight{[%d{yyyy-MM-dd HH:mm:ss.SSS}] - [%p] - [%c:%L] - [Method = %M] - [%m]}%n"/>
<Policies>
<!--单个日志文件大小,-->
<SizeBasedTriggeringPolicy size="50 MB"/>
<!--只留一个文件,其他的全部压缩-->
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
<!--max参数指定了计数器的最大值。一旦计数器达到了最大值,过旧的文件将被删除-->
<DefaultRolloverStrategy max="30" compressionLevel="9">
<!--basePath指定了扫描开始路径,为baseDir文件夹。maxDepth指定了目录扫描深度,为2表示扫描baseDir文件夹及其子文件夹。IfFileName指定了文件名需满足的条件,IfLastModified指定了文件修改时间需要满足的条件。-->
<Delete basePath="${basedir}" maxDepth="2">
<IfFileName glob="*/*.log.gz"/>
<IfLastModified age="7d"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</Appenders>
<Loggers>
<!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
<Logger name="org.springframework" level="INFO"/>
<Logger name="org.mybatis" level="INFO"/>
<Logger name="com.zaxxer.hikari" level="INFO"/>
<logger name="org.springframework" level="info" additivity="false" includeLocation="true">
<AppenderRef ref="console"/>
<AppenderRef ref="${all-logger}"/>
</logger>
<!--如果只是想输出sql语句 ,日志级别为DEBUG;如果既需要打印sql语句也需要打印sql执行结果集则修改日志级别为-TRACE-->
<logger name="com.example.demo" level="DEBUG" additivity="false" includeLocation="true">
<AppenderRef ref="console"/>
<AppenderRef ref="${all-logger}"/>
</logger>
<!--根记录全部输出到控制台上-->
<root level="DEBUG">
<appender-ref ref="console"/>
<appender-ref ref="${all-logger}"/>
</root>
</Loggers>
</Configuration>
三、application.yml
server:
port: 8099
servlet:
context-path: /demo
# 多数据源
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://XXXXX?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&failOverReadOnly=false
username: XXXXX
password: XXXXX
mybatis:
mapper-locations: classpath:/mapper/*.xml
configuration:
map-underscore-to-camel-case: false
log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
logging:
config: classpath:log4j2.xml
level:
com.example.demo.**.mapper: debug
四、加几条测试日志
StudentinfoController 加几条日志
最后项目的完整结构如下
启动项目,http://localhost:8099/demo/studentinfoController/selectStudent
控制台日志
文件日志
这里有一个问题,可以看到 打印的sql 只有语句,没有查询结果,如果想要打印结果,可以改成这样
<!--如果只是想输出sql语句 ,日志级别为DEBUG;如果既需要打印sql语句也需要打印sql执行结果集则修改日志级别为TRACE-->
<logger name="com.example.demo" level="TRACE" additivity="false" includeLocation="true">
<AppenderRef ref="console"/>
<AppenderRef ref="${all-logger}"/>
</logger>
这个时候你就会看到打印这样的结果
控制台
文件
不过不建议打印结果,因为往往我们查询结果会很大,所以不打印为好。
五、采用注解@log4j2
1、log4j2.xml 配置
<!--sql日志输出-->
<!--RollingFile实现日志文件滚动更新-->
<RollingFile name="SQLAppender" fileName="${basedir}/SQLAppender.log" append="true" filePattern="${basedir}/$${date:yyyy-MM}/${all-logger}-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="%highlight{[%d{yyyy-MM-dd HH:mm:ss.SSS}] - [%p] - [%c:%L] - [Method = %M] - [%m]}%n"/>
<Policies>
<!--单个日志文件大小,-->
<SizeBasedTriggeringPolicy size="50 MB"/>
<!--只留一个文件,其他的全部压缩-->
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
<!--max参数指定了计数器的最大值。一旦计数器达到了最大值,过旧的文件将被删除-->
<DefaultRolloverStrategy max="30" compressionLevel="9">
<!--basePath指定了扫描开始路径,为baseDir文件夹。maxDepth指定了目录扫描深度,为2表示扫描baseDir文件夹及其子文件夹。IfFileName指定了文件名需满足的条件,IfLastModified指定了文件修改时间需要满足的条件。-->
<Delete basePath="${basedir}" maxDepth="2">
<IfFileName glob="*/*.log.gz"/>
<IfLastModified age="7d"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<!--service-->
<RollingFile name="ServiceAppender" fileName="${basedir}/ServiceAppender.log" append="true" filePattern="${basedir}/$${date:yyyy-MM}/${all-logger}-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="%highlight{[%d{yyyy-MM-dd HH:mm:ss.SSS}] - [%p] - [%c:%L] - [Method = %M] - [%m]}%n"/>
<Policies>
<!--单个日志文件大小,-->
<SizeBasedTriggeringPolicy size="50 MB"/>
<!--只留一个文件,其他的全部压缩-->
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
<!--max参数指定了计数器的最大值。一旦计数器达到了最大值,过旧的文件将被删除-->
<DefaultRolloverStrategy max="30" compressionLevel="9">
<!--basePath指定了扫描开始路径,为baseDir文件夹。maxDepth指定了目录扫描深度,为2表示扫描baseDir文件夹及其子文件夹。IfFileName指定了文件名需满足的条件,IfLastModified指定了文件修改时间需要满足的条件。-->
<Delete basePath="${basedir}" maxDepth="2">
<IfFileName glob="*/*.log.gz"/>
<IfLastModified age="7d"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<Loggers>
<!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
<Logger name="org.springframework" level="INFO"/>
<Logger name="org.mybatis" level="INFO"/>
<Logger name="com.zaxxer.hikari" level="INFO"/>
<logger name="org.springframework" level="info" additivity="false" includeLocation="true">
<AppenderRef ref="console"/>
</logger>
<!--如果只是想输出sql语句 ,日志级别为DEBUG;如果既需要打印sql语句也需要打印sql执行结果集则修改日志级别为-TRACE-->
<asyncLogger name="com.example.demo" level="DEBUG" additivity="false" includeLocation="true">
<AppenderRef ref="console"/>
<AppenderRef ref="SQLAppender"/>
</asyncLogger>
<!-- 定义一个注解名称-->
<asyncLogger name="SERVICEACTION" additivity="false" level="info">
<AppenderRef ref="console"/>
<appender-ref ref="ServiceAppender" />
</asyncLogger>
<!--根记录全部输出到控制台上-->
<asyncRoot level="info">
<!-- 注:部署时,只用 DefaultAppender 开发时只用Console -->
<appender-ref ref="Console"/>
<appender-ref ref="SERVICEACTION"/>
</asyncRoot>
2、测试类
启动项目,
控制台:
service 日志文件
sql 日志文件
六、打印多个不同日志文件日志
首先注解的形式就注定了单个注解文件只能打印到一个文件里面,mybatis 的特殊日志除外,如果想要一个类里面打印日志到不同文件里面,就可以采用下面这种方法
1、log4j2.xml 配置
<?xml version="1.0" encoding="UTF-8" ?>
<Configuration monitoringInterval="3600" shutdownHook="disable">
<Properties>
<!--日志目录-->
<Property name="basedir">logs/server</Property>
</Properties>
<Appenders>
<!--控制台输出-->
<Console name="console" target="SYSTEM_OUT">
<!--日志样式pattern-->
<PatternLayout pattern="%highlight{[%d{yyyy-MM-dd HH:mm:ss.SSS}] - [%p] - [%c:%L] - [Method = %M] - [%m]}%n"/>
</Console>
<!--service-->
<RollingFile name="ServiceAppender" fileName="${basedir}/ServiceAppender.log" append="true" filePattern="${basedir}/$${date:yyyy-MM}/ServiceAppender-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="%highlight{[%d{yyyy-MM-dd HH:mm:ss.SSS}] - [%p] - [%c:%L] - [Method = %M] - [%m]}%n"/>
<Policies>
<!--单个日志文件大小,-->
<SizeBasedTriggeringPolicy size="50 MB"/>
<!--只留一个文件,其他的全部压缩-->
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
<!--max参数指定了计数器的最大值。一旦计数器达到了最大值,过旧的文件将被删除-->
<DefaultRolloverStrategy max="30" compressionLevel="9">
<!--basePath指定了扫描开始路径,为baseDir文件夹。maxDepth指定了目录扫描深度,为2表示扫描baseDir文件夹及其子文件夹。IfFileName指定了文件名需满足的条件,IfLastModified指定了文件修改时间需要满足的条件。-->
<Delete basePath="${basedir}" maxDepth="2">
<IfFileName glob="*/*.log.gz"/>
<IfLastModified age="7d"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<!--task 日志-->
<RollingFile name="TaskAppender" fileName="${basedir}/TaskAppender.log" append="true" filePattern="${basedir}/$${date:yyyy-MM}/${TaskAppender-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="%highlight{[%d{yyyy-MM-dd HH:mm:ss.SSS}] - [%p] - [%c:%L] - [Method = %M] - [%m]}%n"/>
<Policies>
<!--单个日志文件大小,-->
<SizeBasedTriggeringPolicy size="50 MB"/>
<!--只留一个文件,其他的全部压缩-->
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
<!--max参数指定了计数器的最大值。一旦计数器达到了最大值,过旧的文件将被删除-->
<DefaultRolloverStrategy max="30" compressionLevel="9">
<!--basePath指定了扫描开始路径,为baseDir文件夹。maxDepth指定了目录扫描深度,为2表示扫描baseDir文件夹及其子文件夹。IfFileName指定了文件名需满足的条件,IfLastModified指定了文件修改时间需要满足的条件。-->
<Delete basePath="${basedir}" maxDepth="2">
<IfFileName glob="*/*.log.gz"/>
<IfLastModified age="7d"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<!--sql日志输出-->
<!--RollingFile实现日志文件滚动更新-->
<RollingFile name="SQLAppender" fileName="${basedir}/SQLAppender.log" append="true" filePattern="${basedir}/$${date:yyyy-MM}/SQLAppender-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="%highlight{[%d{yyyy-MM-dd HH:mm:ss.SSS}] - [%p] - [%c:%L] - [Method = %M] - [%m]}%n"/>
<Policies>
<!--单个日志文件大小,-->
<SizeBasedTriggeringPolicy size="50 MB"/>
<!--只留一个文件,其他的全部压缩-->
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
<!--max参数指定了计数器的最大值。一旦计数器达到了最大值,过旧的文件将被删除-->
<DefaultRolloverStrategy max="30" compressionLevel="9">
<!--basePath指定了扫描开始路径,为baseDir文件夹。maxDepth指定了目录扫描深度,为2表示扫描baseDir文件夹及其子文件夹。IfFileName指定了文件名需满足的条件,IfLastModified指定了文件修改时间需要满足的条件。-->
<Delete basePath="${basedir}" maxDepth="2">
<IfFileName glob="*/*.log.gz"/>
<IfLastModified age="7d"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</Appenders>
<Loggers>
<!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
<Logger name="org.springframework" level="INFO"/>
<Logger name="org.mybatis" level="INFO"/>
<Logger name="com.zaxxer.hikari" level="INFO"/>
<logger name="org.springframework" level="info" additivity="false" includeLocation="true">
<AppenderRef ref="console"/>
</logger>
<!-- 定义一个注解名称-->
<asyncLogger name="SERVICEACTION" additivity="false" level="info">
<AppenderRef ref="console"/>
<appender-ref ref="ServiceAppender" />
</asyncLogger>
<asyncLogger name="TASKACTION" additivity="false" level="info">
<AppenderRef ref="console"/>
<appender-ref ref="TaskAppender" />
</asyncLogger>
<!--如果只是想输出sql语句 ,日志级别为DEBUG;如果既需要打印sql语句也需要打印sql执行结果集则修改日志级别为-TRACE-->
<asyncLogger name="com.example.demo" level="DEBUG" additivity="false" includeLocation="true">
<AppenderRef ref="console"/>
<AppenderRef ref="SQLAppender"/>
<appender-ref ref="ServiceAppender"/>
</asyncLogger>
<!--根记录全部输出到控制台上-->
<asyncRoot level="info">
<!-- 注:部署时,只用 DefaultAppender 开发时只用Console -->
<appender-ref ref="Console"/>
<appender-ref ref="ServiceAppender"/>
</asyncRoot>
</Loggers>
</Configuration>
2、测试类
启动项目。
控制台:
task文件
service文件
sql文件
这样就很完美了。
如果还是想用注解,那就只能两种结合使用了,注解+logger.getname
控制台
service
sql
task
以上就是最完整的 idea +Maven+springboot+mybatis+log4j2 的结合使用了。
如果觉得对你有帮助的话欢迎点赞关注哦!