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/
任何傻瓜都能写出计算机可以理解的代码。好的程序员能写出人能读懂的代码。