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"><!--自定义属性--></span>
<span class="hljs-tag"><<span class="hljs-name">properties</span>></span>
<span class="hljs-comment"><!--输出日志的格式:
%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} ##高亮显示
--></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"pattern"</span>></span>%d{yyyy-MM-dd HH🇲🇲ss.SSS} [%t] %-5level %C{36}.%M(%F:%L) %msg%xEx%n<span class="hljs-tag"></<span class="hljs-name">property</span>></span>
<span class="hljs-tag"></<span class="hljs-name">properties</span>></span>
<span class="hljs-tag"><<span class="hljs-name">Appenders</span>></span>
<span class="hljs-tag"><<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>></span>
<span class="hljs-comment"><!--只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) --></span>
<span class="hljs-tag"><<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>/></span>
<span class="hljs-comment"><!--输出日志的格式,引用自定义模板 pattern --></span>
<span class="hljs-tag"><<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>/></span>
<span class="hljs-tag"></<span class="hljs-name">Console</span>></span>
<span class="hljs-tag"></<span class="hljs-name">Appenders</span>></span>
<span class="hljs-comment"><!--然后定义logger,只有定义了logger并引入上面定义的appender,appender才会生效 --></span>
<span class="hljs-tag"><<span class="hljs-name">Loggers</span>></span>
<span class="hljs-comment"><!--过滤掉spring等框架的无用日志信息,也可以在springboot的logging.level.org.springframework=FATAL设置--></span>
<span class="hljs-tag"><<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>/></span>
<span class="hljs-comment"><!--建立一个默认的Root的logger,记录>=level的信息,如果这里的level高于Appenders中的,则Appenders中也是以此等级为起点。
比如,这里level="fatal",则Appenders中只出现fatal信息。
温馨提示:prodlevel建议设置为warn
--></span>
<span class="hljs-tag"><<span class="hljs-name">Root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">"info"</span>></span>
<span class="hljs-comment"><!-- 输出器,可选上面定义的任何项组合,或全选--></span>
<span class="hljs-tag"><<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"ConsoleLog"</span>/></span>
<span class="hljs-tag"></<span class="hljs-name">Root</span>></span>
<span class="hljs-tag"></<span class="hljs-name">Loggers</span>></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"><<span class="hljs-name">Appenders</span>></span>
<span class="hljs-comment"><!-- 配置mongdb appender --></span>
<span class="hljs-tag"><<span class="hljs-name">NoSql</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"MongoAppender"</span>></span>
<span class="hljs-comment"><!--参数分别是:数据库名,集合名,服务器ip,端口。还可以指定其他参数或升级版本,详情请看:http://logging.apache.org/log4j/2.x/manual/appenders.html#NoSQLAppender--></span>
<span class="hljs-tag"><<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>/></span>
<span class="hljs-tag"></<span class="hljs-name">NoSql</span>></span>
<span class="hljs-tag"></<span class="hljs-name">Appenders</span>></span>
<span class="hljs-comment"><!--然后定义logger,只有定义了logger并引入上面定义的appender,appender才会生效 --></span>
<span class="hljs-tag"><<span class="hljs-name">Loggers</span>></span>
<span class="hljs-comment"><!--过滤掉spring等框架的无用日志信息,也可以在springboot的logging.level.org.springframework=FATAL设置--></span>
<span class="hljs-tag"><<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>/></span>
<span class="hljs-comment"><!--建立一个默认的Root的logger,记录>=level的信息,如果这里的level高于Appenders中的,则Appenders中也是以此等级为起点。
比如,这里level="fatal",则Appenders中只出现fatal信息。
温馨提示:prodlevel建议设置为warn
--></span>
<span class="hljs-tag"><<span class="hljs-name">Root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">"info"</span>></span>
<span class="hljs-comment"><!-- 输出器,可选上面定义的任何项组合,或全选--></span>
<span class="hljs-tag"><<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"MongoAppender"</span> /></span>
<span class="hljs-tag"></<span class="hljs-name">Root</span>></span>
<span class="hljs-tag"></<span class="hljs-name">Loggers</span>></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"><<span class="hljs-name">Appenders</span>></span>
<span class="hljs-comment"><!-- 配置mongdb appender --></span>
<span class="hljs-tag"><<span class="hljs-name">NoSql</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"MongoAppender"</span>></span>
<span class="hljs-comment"><!--参数分别是:数据库名,集合名,服务器ip,端口。还可以指定其他参数或升级版本,详情请看:http://logging.apache.org/log4j/2.x/manual/appenders.html#NoSQLAppender--></span>
<span class="hljs-tag"><<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>/></span>
<span class="hljs-tag"></<span class="hljs-name">NoSql</span>></span>
<span class="hljs-tag"></<span class="hljs-name">Appenders</span>></span>
<span class="hljs-comment"><!--然后定义logger,只有定义了logger并引入上面定义的appender,appender才会生效 --></span>
<span class="hljs-tag"><<span class="hljs-name">Loggers</span>></span>
<span class="hljs-comment"><!--过滤掉spring等框架的无用日志信息,也可以在springboot的logging.level.org.springframework=FATAL设置--></span>
<span class="hljs-tag"><<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>/></span>
<span class="hljs-comment"><!--建立一个默认的Root的logger,记录>=level的信息,如果这里的level高于Appenders中的,则Appenders中也是以此等级为起点。
比如,这里level="fatal",则Appenders中只出现fatal信息。
温馨提示:prodlevel建议设置为warn
--></span>
<span class="hljs-tag"><<span class="hljs-name">Root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">"info"</span>></span>
<span class="hljs-comment"><!-- 输出器,可选上面定义的任何项组合,或全选--></span>
<span class="hljs-tag"><<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"MongoAppender"</span> /></span>
<span class="hljs-tag"></<span class="hljs-name">Root</span>></span>
<span class="hljs-tag"></<span class="hljs-name">Loggers</span>></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 中查看日志,我这里有一个简单的查日志的项目,有兴趣可以看看。