SpringBoot 使用 Log4j2 结合 Mongodb记录日志

一、安装Mongodb

首先,安装Mongodb,我这里使用的是Linux7,windows版本自行百度。

二、添加依赖

我这里使用的是SpringBoot2.x.x版本,如果发现jar包冲突,不出意外就是别的jar包引入了logback,只需排除logback依赖即可。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <!--必须排除掉默认的logback-->
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- mongodb driver -->
 <!-- https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver -->
 <dependency>
     <groupId>org.mongodb</groupId>
     <artifactId>mongo-java-driver</artifactId>
     <version>3.10.1</version>
 </dependency>

 <!-- log4j2 -->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-log4j2</artifactId>
 </dependency>

 <!-- 必需,否则报错 Springboot 1.5.x 使用 2.7版本-->
 <!--log4j-core-->
 <dependency>
     <groupId>org.apache.logging.log4j</groupId>
     <artifactId>log4j-core</artifactId>
     <version>2.9.1</version>
 </dependency>
 <!-- 必需,否则报错 Springboot 1.5.x 使用 2.7版本-->
 <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-nosql -->
 <dependency>
     <groupId>org.apache.logging.log4j</groupId>
     <artifactId>log4j-nosql</artifactId>
     <version>2.9.0</version>
 </dependency> 

三、配置Log4j

这里使用了多环境配置,在dev中,只在控制台打印日志,test、prod环境只将日志记录在mongodb中。
在这里插入图片描述
下面给出Log4j2三个环境的配置xml

log4j2-dev.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--
    主标签,有两个log4j2的关键属性:
    status:设置log4j2的自身log级别。日志级别: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL,
    其中 off 表示关闭日志输出,fatal 表示严重错误。
    monitorInterval:Log4j2能够自动检测配置文件变化,并使用新的配置,这个单位是秒。
-->
<!--设置log4j2的自身log级别为warn -->
<Configuration status="warn">

    <!--自定义属性-->
    <properties>
        <!--输出日志的格式:
            %level{参数1}{参数2}{参数3} ##输出日志的级别
            %d{yyyy-MM-dd HH:mm:ss, SSS}:日志生产时间
            %t:打印日志方法所在线程名
            %p:日志输出格式
            %F|%file                  ##输出文件名
            %c{参数} 或 %logger{参数}  ##输出日志名称
            %C{参数} 或 %class{参数    ##输出类型
            %m 或 %msg 或 %message ##输出日志信息
            %n:换行符
            %C:Java类名
            %l  ##输出错误的完整位置
            %L:日志输出所在行数
            %M 或 %method ##输出方法名
            hostName:本地机器名
            hostAddress:本地ip地址
            highlight{pattern}{style} ##高亮显示
        -->
        <property name="pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %C{36}.%M(%F:%L) %msg%xEx%n</property>
    </properties>

    <Appenders>
        <Console name="ConsoleLog" target="SYSTEM_OUT">
            <!--只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
            <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--输出日志的格式,引用自定义模板 pattern -->
            <PatternLayout charset="UTF-8" pattern="${pattern}"/>
        </Console>
    </Appenders>

    <!--然后定义logger,只有定义了logger并引入上面定义的appender,appender才会生效 -->
    <Loggers>
        <!--过滤掉spring等框架的无用日志信息,也可以在springboot的logging.level.org.springframework=FATAL设置-->
        <logger name="org.springframework" level="warn"/>

        <!--建立一个默认的Root的logger,记录>=level的信息,如果这里的level高于Appenders中的,则Appenders中也是以此等级为起点。
            比如,这里level="fatal",则Appenders中只出现fatal信息。
            温馨提示:prodlevel建议设置为warn
        -->
        <Root level="info">
            <!-- 输出器,可选上面定义的任何项组合,或全选-->
            <appender-ref ref="ConsoleLog"/>
        </Root>
    </Loggers>

</Configuration>

log4j2-test.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--
    主标签,有两个log4j2的关键属性:
    status:设置log4j2的自身log级别。日志级别: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL,
    其中 off 表示关闭日志输出,fatal 表示严重错误。
    monitorInterval:Log4j2能够自动检测配置文件变化,并使用新的配置,这个单位是秒。
-->
<!--设置log4j2的自身log级别为warn -->
<Configuration status="warn">

    <Appenders>
        <!-- 配置mongdb appender -->
        <NoSql name="MongoAppender">
            <!--参数分别是:数据库名,集合名,服务器ip,端口。还可以指定其他参数或升级版本,详情请看:http://logging.apache.org/log4j/2.x/manual/appenders.html#NoSQLAppender-->
            <MongoDb databaseName="test" collectionName="log" server="192.168.0.146" port="27017"/>
        </NoSql>
    </Appenders>

    <!--然后定义logger,只有定义了logger并引入上面定义的appender,appender才会生效 -->
    <Loggers>
        <!--过滤掉spring等框架的无用日志信息,也可以在springboot的logging.level.org.springframework=FATAL设置-->
        <logger name="org.springframework" level="warn"/>

        <!--建立一个默认的Root的logger,记录>=level的信息,如果这里的level高于Appenders中的,则Appenders中也是以此等级为起点。
            比如,这里level="fatal",则Appenders中只出现fatal信息。
            温馨提示:prodlevel建议设置为warn
        -->
        <Root level="info">
            <!-- 输出器,可选上面定义的任何项组合,或全选-->
            <appender-ref ref="MongoAppender" />
        </Root>
    </Loggers>

</Configuration>

log4j2-prod.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--
    主标签,有两个log4j2的关键属性:
    status:设置log4j2的自身log级别。日志级别: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL,
    其中 off 表示关闭日志输出,fatal 表示严重错误。
    monitorInterval:Log4j2能够自动检测配置文件变化,并使用新的配置,这个单位是秒。
-->
<!--设置log4j2的自身log级别为warn -->
<Configuration status="warn">

    <Appenders>
        <!-- 配置mongdb appender -->
        <NoSql name="MongoAppender">
            <!--参数分别是:数据库名,集合名,服务器ip,端口。还可以指定其他参数或升级版本,详情请看:http://logging.apache.org/log4j/2.x/manual/appenders.html#NoSQLAppender-->
            <MongoDb databaseName="prod" collectionName="log" server="192.168.0.146" port="27017"/>
        </NoSql>
    </Appenders>

    <!--然后定义logger,只有定义了logger并引入上面定义的appender,appender才会生效 -->
    <Loggers>
        <!--过滤掉spring等框架的无用日志信息,也可以在springboot的logging.level.org.springframework=FATAL设置-->
        <logger name="org.springframework" level="warn"/>

        <!--建立一个默认的Root的logger,记录>=level的信息,如果这里的level高于Appenders中的,则Appenders中也是以此等级为起点。
            比如,这里level="fatal",则Appenders中只出现fatal信息。
            温馨提示:prodlevel建议设置为warn
        -->
        <Root level="info">
            <!-- 输出器,可选上面定义的任何项组合,或全选-->
            <appender-ref ref="MongoAppender" />
        </Root>
    </Loggers>

</Configuration>

然后是SpringBoot的配置文件,每个环境指定对应的Log4j的配置即可。

application-dev.yml

# spring boot会自动加载mongodb,这里需要配置mongodb
spring:        
    data:
      mongodb:
        uri: mongodb://192.168.0.146/dev
        port: 27017
logging:
  config: classpath:config/log4j2-dev.xml

application-test.yml

# spring boot会自动加载mongodb,这里需要配置mongodb
spring:        
    data:
      mongodb:
        uri: mongodb://192.168.0.146/test
        port: 27017
logging:
  config: classpath:config/log4j2-test.xml

application-prod.yml

# spring boot会自动加载mongodb,这里需要配置mongodb
spring:        
    data:
      mongodb:
        uri: mongodb://192.168.0.146/prod
        port: 27017
logging:
  config: classpath:config/log4j2-prod.xml

四、测试

现在application.yml中配置profiles为dev

spring:
  profiles:
    active: dev

可以发现日志都正常打印。
在这里插入图片描述
然后将profiles改为为test

spring:
  profiles:
    active: test

可以看到控制台已经不打印日志
在这里插入图片描述
我们使用Studio 3T连接mongodb看看
在这里插入图片描述
在这里插入图片描述

我们可以看到,多了一个test库,正是我们配置的test库,log集合也有了,prod环境和test环境大同小异,就不多说了。
这里日志成功记录到了mongodb中,但是我们总不可能每次都去mongodb中查看日志,我这里有一个简单的查日志的项目,有兴趣可以看看。


作者:不敲代码的攻城狮
出处:https://www.cnblogs.com/leigq/
任何傻瓜都能写出计算机可以理解的代码。好的程序员能写出人能读懂的代码。

 
原文地址:https://www.cnblogs.com/leigq/p/13406553.html