springboot+log4j2+slf4j控制台打印帶sql日志


springBoot自帶的日志系統功能有限,自定義不方便,引入了log4j2+slf4j。第一次引入報各種錯,通過不斷摸爬,總結以下:

1.引入log4j2+slf4j后,需要屏蔽原來的logback,logging

<!-- 日志使用 log4j2+slf4j 方式 首先需要去掉boot默認的logging依賴,然后添加log4j2依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<!-- 去除舊依賴 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>

<!-- 引入log4j2依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
再次運行,果然成功了,然而控制台並未打印帶sql的日志,不方便調試代碼,經過混跡本站,歷時兩天,終於找到了,還得屏蔽這些

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 去掉默認的,不然log4j2沒效果 -->
<!--去除springboot對logback的依賴 -->
<exclusions>
<exclusion>
<artifactId>logback-access</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
<exclusion>
<artifactId>logback-core</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
<exclusion>
<artifactId>logback-classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
<!-- 打印日志 log4j2 需要 是排除多余的jar包 springboot 默認使用logback log4j引入時候需要排除 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
還要再application.yml打開

#Mybatis配置
mybatis:
base-packages: com.motorway.evaluate.modules.*.mapper.*
mapper-locations: classpath*:/mapper/**/*.xml
#控制台打印帶sql日志:configuration打開
# configuration:
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
config-location: classpath:mybatis.xml
#下面這兩個屬性配合使用掃描pojo類的位置,package指定只掃描的包,aliases表示僅掃描路徑下以該類作為父類的域對象
type-aliases-package: com.motorway.evaluate.modules.system.model
type-aliases-super-type: com.motorway.evaluate.common.BaseDomain #java.lang.Object
如上所示,通過configuration的屬性打開,在log4j2.xml實現具體效果。我的log4j2.xml如下

<?xml version="1.0" encoding="UTF-8" ?>
<!--
6個優先級從高到低依次為OFF,FATAL,ERROR,WARN,INFO,DEBUG,TRACE,ALL。
如設置優先級為WARN,那么OFF、FATAL、ERROR、WARN 4個級別的log能正常輸出
設置為OFF 表示不記錄log4j2本身的日志
-->

<!-- status:用來指定log4j本身的打印日志級別,可以不設置,當設置成trace時,你會看到log4j2內部各種詳細輸出。
monitorInterval:指定log4j自動重新配置的監測間隔時間 -->
<configuration status="INFO" monitorInterval="30">
<!-- 自己設置屬性,后面通過${}來訪問 -->
<properties>
<!-- 格式化輸出:%date表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度 %msg:日志消息,%n是換行符-->
<!-- %logger{36} 表示 Logger 名字最長36個字符 -->
<property name="LOG_PATTERN" value="%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
<property name="LOG_HOME" value="/logs" />
<property name="FILE_NAME" value="evaluate.log" />
</properties>

<appenders>
<!-- Appender 1.輸出到Console控制台 -->
<console name="Console" target="SYSTEM_OUT" >
<!-- ThresholdFilter指定日志消息的輸出最低層次 -->
<!-- 控制台只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch) -->
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"></ThresholdFilter>

<PatternLayout pattern="${LOG_PATTERN}"></PatternLayout>
</console>

<!-- 文件會打印出所有信息,這個log每次重啟項目會自動清空,由append屬性決定,這個也挺有用的,適合臨時測試用 -->
<!-- append為TRUE表示重啟后消息增加到指定文件中,false表示重啟后消息覆蓋指定的文件內容,默認值是true -->
<!--Appender 2. 輸出到滾動保存的文件, 觸發保存日志文件的條件是日志文件大於3KB,只保存最新的10個日志-->
<!--<File name="templog" fileName="${LOG_HOME}/temp.log" append="true">
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout charset="UTF-8" pattern="${LOG_PATTERN}"/>
</File>-->

<!-- 這個會打印出所有的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面並進行壓縮,作為存檔-->
<!--Appender 3. 輸出到滾動保存的文件, 觸發保存日志文件的條件是日志文件大於50M,只保存最新的30個日志-->
<RollingFile name="RollingFiledebug" fileName="${LOG_HOME}/labour-debug.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/labour-debug-%d{yyyy-MM-dd}-%i.log.gz">
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout charset="UTF-8" pattern="${LOG_PATTERN}"/>
<!--<SizeBasedTriggeringPolicy size="50MB"/>-->
<Policies>
<!--interval屬性用來指定多久滾動一次,默認是1 hour-->
<TimeBasedTriggeringPolicy interval="4"/>
<SizeBasedTriggeringPolicy size="50MB"/>
</Policies>
<!-- DefaultRolloverStrategy 中的參數max,可以限制 SizeBasedTriggeringPolicy中size超出后,只保留max個存檔-->
<!-- DefaultRolloverStrategy屬性如不設置,則默認為最多同一文件夾下7個文件,這里設置了30 -->
<DefaultRolloverStrategy max="30"/>
</RollingFile>

<!--Appender 4. 輸出到滾動保存的文件, 觸發保存日志文件的條件是每分鍾第一次的日志事件。ERROR日志是按分鍾產生日志 -->
<!-- 這個會打印出所有的error及以下級別的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面並進行壓縮,作為存檔-->
<RollingFile name="RollingFileError" fileName="${LOG_HOME}/labour-error.log" filePattern="${LOG_HOME}/labour-error-%d{yyyy-MM-dd}_%i.log.gz">
<!--控制台只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout charset="UTF-8" pattern="${LOG_PATTERN}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="4"/>
<SizeBasedTriggeringPolicy size="50MB"/>
</Policies>
<DefaultRolloverStrategy max="30"/>
</RollingFile>

<!--<RollingFile name="RollingFile" fileName="${LOG_HOME}/rar.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/%d{yyyy-MM-dd}-%i.log.gz">
&lt;!&ndash; filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{MM-dd-yyyy}-%i.log.gz"> &ndash;&gt;
<PatternLayout charset="UTF-8" pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
&lt;!&ndash;日志文件最大值 第二天壓縮&ndash;&gt;
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="60 MB"/>
</Policies>
</RollingFile>-->
</appenders>

<!--Logger節點用來單獨指定日志的形式,比如要為指定包下的class指定不同的日志級別等。-->
<!--然后定義loggers,只有定義了logger並引入的appender,appender才會生效-->

<loggers>

<!--監控系統信息-->
<!--若是additivity設為false,則 子Logger 只會在自己的appender里輸出,而不會在 父Logger 的appender里輸出。-->
<logger name="org.springframework" level="INFO" additivity="false">
<AppenderRef ref="Console" />
</logger>
<!-- 過濾掉spring和mybatis的一些信息,輸出到配置的一個或多個AppenderRef中-->
<logger name="org.mybatis" level="INFO" additivity="false">
<AppenderRef ref="Console" />
</logger>

<!-- 將業務dao接口填寫進去,並用控制台輸出即可 -->
<logger name="com.motorway.evaluate.modules.*.mapper" level="TRACE" additivity="false">
<AppenderRef ref="Console"/>
</logger>

<!-- 建立一個默認的root的level是全局級別的 -->
<root level="warn">
<appender-ref ref="Console"/>
<!--<appender-ref ref="templog"/>-->
<appender-ref ref="RollingFiledebug"/>
<appender-ref ref="RollingFileError"/>
<!--<appender-ref ref="RollingFile"/>-->
</root>

</loggers>

</configuration>
這里注意要將level設置為Trace,如果是Debug的話不會打印參數,和結果,只會打印語句。

Loggers必有一個Root節點,不指定appender的類默認是用root這個根Logger。其他的Logger節點默認繼承root 。

如果指定了appender-ref,那么會在指定的這個Appender和Root的Appender中都會輸出,此時我們可以設置Logger的additivity="false"只在自定義的Appender中進行輸出。


————————————————
版權聲明:本文為CSDN博主「擦肩而過」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zwj1030711290/article/details/114133986


免責聲明!

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



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