Java实战03之idea pringboot 整合log4j2日志,可以多日志文件

目录

前言:

一、先添加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 的结合使用了。

如果觉得对你有帮助的话欢迎点赞关注哦!
 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值