文章目錄
一、安裝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中查看日志,我這里有一個簡單的查日志的項目,有興趣可以看看。