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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM