一,前言
日常開發中經常需要在控制台輸出一些信息,如果這些東西不加管理,那么很容易就被輸出信息淹沒。幸好,我們有日志相關的庫來幫助我們格式化控制台的輸出。
這篇文章將介紹如何配置 Slf4j 及其具體的實現,后面會介紹如何配置成彩色的。

二,介紹
之前看一些文章就對 Slf4j 略有所聞,搬磚的時候也稍微用過,只不過沒有仔細去看。今天在寫代碼的時候,想到要用日志工具了,所以直接在 maven 中引入了下面的依賴。
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.0-alpha1</version>
</dependency>
一運行就報錯了。

搜一搜,StackOverflow 上就一個言簡意賅的回答。Slf4j 是日志框架的抽象,它提供了接口,不提供實現!具體的實現,用戶可以自由選擇任何一個日志框架,比如 Log4j, Logback 等等。所以,我們只需要 maven 中引入具體的實現就好了。
SLF4J stands for Simple Logging Facade for Java. It provides a simple abstraction of all the logging frameworks. It enables a user to work with any of the logging frameworks such as Log4j, Logback, JUL (java.util.logging), etc. using single dependency.
這里我選擇了 Log4j,直接在 maven 中引入下面的依賴。
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>2.0.0-alpha1</version>
</dependency>
然后我們在運行一下項目。又是一波報錯,下面這個報錯說沒有指定 appender,所以應該是沒有配置文件的緣故。

我們再搜一搜,StackOverflow 還有是有回答。我們只需要在 classpath 中放入 log4j.properties 就好了。
於是乎,我們在 resouces 文件夾下面放入 log4j.properties 就好了。
至於如何配置,我們還需要去具體的看每個實現的配置方式,比如 log4j 要怎么配置,logback 又有怎么配置。這里分享一下我的配置。
log4j.properties,ConversionPattern 我們可以參考這里

log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=log.ColorPatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} [%p] %m%n
此外還需要一個自定義的類文件,放在 log 包下面。顏色是 extends 默認的 PatternLayout,並覆蓋 format 方法來實現的,至於顏色怎么選,具體可以看這個
package log;
import org.apache.log4j.Level;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.spi.LoggingEvent;
public class ColorPatternLayout extends PatternLayout {
@Override
public String format(LoggingEvent event) {
Level level = event.getLevel();
String prefix = "\033[33m";
String suffix = "\033[0m";
switch (level.toInt()) {
case Level.TRACE_INT:
prefix = "\033[30m";
break;
case Level.DEBUG_INT:
prefix = "\033[34m";
break;
case Level.INFO_INT:
prefix = "\033[35m";
break;
case Level.WARN_INT:
prefix = "\033[33m";
break;
case Level.ERROR_INT:
prefix = "\033[31m";
break;
}
return prefix + super.format(event) + suffix;
}
}
三,總結
這篇文章簡單介紹了如何使用 Slf4j 這個框架,不涉及原理,只是簡簡單單地講了講如何使用。它背后做的事情還挺有意思的,把接口寫好,實現就看不同的庫。
