2021年1月11日 星期一

[SpringBoot 1.5] SLF4j使用

查詢slf4j可以找到以下連結

http://www.slf4j.org/

點進去以後再點選SLF4J user manual

其中他就有把範例列出來

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld {
 
public static void main(String[] args) {
   
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
    logger
.info("Hello World");
 
}
}











這一張圖的意思就是,SLF4J API 是中間抽象層

如果要將日誌印出來, 實現層有不同的做法, 都是屬於藍色的部分

而由於有些日誌項目推出較早, 不是基於SLF4J實現的, 因此需要中間的adaption layer

來做中間的轉換, 各實現層也有不同的jar包要導入

然而~你想使用slf4j+logback你可能會遇到Spring是用commons-loggin而

hibernate是用jboss-logging的問題, 其他框架, 也有可能是用不同的紀錄log模式

就會需要做替換的動作, 可以參考首頁中點入legacy APIs.











這裡所做的就是替換的意思

將commons logging API 替換成jcl-over-slf4j.jar

將log4j API 替換成log4j-over-slf4j.jar

因此如何將系統中所有的日誌統一到slf4j

1 將系統中其他日誌框架先排除出去

2 用中間包來替換原有的日誌框架

3 我們導入sl4j其他的實現

----------------------------------------------------------

而Spring Boot也是這樣替換的

這部分我們可以看到pom.xml檔案

點Diagrams->Show Dependencies

其中

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<version>2.4.1</version>
<scope>compile</scope>
</dependency>
他底層依賴關係如下









這部分沒觀察出來怎麼替換的, 

就我的觀察看起來蠻像jul-to-slf4j他使用maven的dependencies對到SLF4J

有引進slf4j的依賴

講者是說由其他的配置轉成slf4j然後用logback的方式進行實現


-------------------------

import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class SpringBoot03LoggingApplicationTests {
Logger logger =LoggerFactory.getLogger(getClass());
@Test
void contextLoads() {
logger.trace("trace日誌");
logger.debug("debug日誌");
logger.info("info日誌");
logger.warn("warn日誌");
logger.error("error日誌");
}

}
優先順序從低到高, 是從trace到error
預設只會顯示info 以上的log, 除非有設logging.level
--------------------------
appication.properties檔案
這樣寫檔會寫在C巢下面, 記得filename要重複path頭
logging.level.com.atguigu=trace
logging.file.path=/spring/logger
logging.file.name=/spring/logger/app.log

而 如果要使用 logback-spring.xml 可以參考

基本款

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<property name="APP_NAME" value="ApplicationName"/>
<property name="LOG_FILE_PATH" value="/LogFile/${APP_NAME}/logs/"/>
<!--設置 Log 輸出格式-->
<property name="PATTERN_FORMAT" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
<contextName>logback</contextName>
<!--輸出到 Console-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${PATTERN_FORMAT}</pattern>
</encoder>
</appender>

<!--輸出到檔案-->
<appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE_PATH}/%d{yyyy-MM-dd,aux}/logback.info.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>


<root level="info">
<appender-ref ref="console" />
<appender-ref ref="info" />
</root>

</configuration>

如果想將不同級別的檔案拆開來存放可以使用

filter 放在appender中就可以

<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
範例如下
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<property name="APP_NAME" value="ApplicationName"/>
<property name="LOG_FILE_PATH" value="/LogFile/${APP_NAME}/logs/"/>
<!--設定 Log 輸出格式-->
<property name="PATTERN_FORMAT" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
<contextName>logback</contextName>
<!--輸出到 Console-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${PATTERN_FORMAT}</pattern>
</encoder>
</appender>

<!-- info level 輸出到檔案-->
<appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE_PATH}/%d{yyyy-MM-dd,aux}/logback.info.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>

<!-- warn level 輸出到檔案-->
<appender name="warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE_PATH}/%d{yyyy-MM-dd,aux}/logback.warn.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>

<!-- error level 輸出到檔案-->
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE_PATH}/%d{yyyy-MM-dd,aux}/logback.error.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>

<root level="info">
<appender-ref ref="console" />
<appender-ref ref="info" />
<appender-ref ref="warn" />
<appender-ref ref="error" />
</root>

</configuration>
參考來源
邦哥不會寫程式

沒有留言:

張貼留言

[leetcode] [KMP] KMP

ABCDABD... ABCDABF... 簡單的說, 傳統解兩字串匹配部分 可能會來個雙迴圈, 哀個比對, 當不匹配的時候, 會將下方列再後移1位 然後不匹配再後移 然而 如果像上放已經有4個屬於匹配的字串, 她就應該直接往後移四位來匹配, 而不是只移動1位 隱藏的思維是, 當...