SpringBoot 使用 Log4j2 结合 Mongodb记录日志

                <svg xmlns="http://www.w3.org/2000/svg" style="display: none">
                    <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)"></path>
                </svg>
                                        <p></p><div class="toc"><h3 id="3597950182"><span>文章目录<button class="cnblogs-toc-button" title="显示目录导航" aria-expanded="false"></button></span><a href="#3597950182" class="esa-anchor">#</a></h3><ul><ul><ul><ul><li><a href="#Mongodb_1" rel="noopener nofollow">一、安装Mongodb</a></li><li><a href="#_5" rel="noopener nofollow">二、添加依赖</a></li><li><a href="#Log4j_50" rel="noopener nofollow">三、配置Log4j</a></li><li><a href="#_232" rel="noopener nofollow">四、测试</a></li></ul></ul></ul></ul></div><p></p>

一、安装 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">
<span class="hljs-comment">&lt;!--自定义属性--&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">properties</span>&gt;</span>
    <span class="hljs-comment">&lt;!--输出日志的格式:
        %level{参数1}{参数2}{参数3} ##输出日志的级别
        %d{yyyy-MM-dd HH🇲🇲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} ##高亮显示
    --&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"pattern"</span>&gt;</span>%d{yyyy-MM-dd HH🇲🇲ss.SSS} [%t] %-5level %C{36}.%M(%F:%L) %msg%xEx%n<span class="hljs-tag">&lt;/<span class="hljs-name">property</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">properties</span>&gt;</span>

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

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

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

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

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

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

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

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

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

</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 中查看日志,我这里有一个简单的查日志的项目,有兴趣可以看看。