slf4j-log4j使用教程

教程前面一部分概念來自該博客:https://www.cnblogs.com/xrq730/p/8619156.html 。對於slf4j不清楚是什麼的可以先去看看。

開始正文

  1. Sfl4j是什麼

slf4j是門面模式的典型應用,因此在講slf4j前,我們先簡單回顧一下門面模式,

門面模式,其核心爲外部與一個子系統的通信必須通過一個統一的外觀對象進行,使得子系統更易於使用。用一張圖來表示門面模式的結構爲:

https://images2018.cnblogs.com/blog/801753/201803/801753-20180321204740208-1670144043.png

門面模式的核心爲Facade即門面對象,門面對象核心爲幾個點:

  1. 知道所有子角色的功能和責任
  2. 將客戶端發來的請求委派到子系統中,沒有實際業務邏輯
  3. 不參與子系統內業務邏輯的實現

大致上來看,對門面模式的回顧到這裏就可以了,開始接下來對SLF4J的學習。

  1. 我們爲什麼需要使用這個框架

我們爲什麼要使用slf4j,舉個例子:

我們自己的系統中使用了logback這個日誌系統

我們的系統使用了A.jar,A.jar中使用的日誌系統爲log4j

我們的系統又使用了B.jar,B.jar中使用的日誌系統爲slf4j-simple

這樣,我們的系統就不得不同時支持並維護logback、log4j、slf4j-simple三種日誌框架,非常不便。

解決這個問題的方式就是引入一個適配層,由適配層決定使用哪一種日誌系統,而調用端只需要做的事情就是打印日誌而不需要關心如何打印日誌,slf4j或者commons-logging就是這種適配層,slf4j是本文研究的對象。

從上面的描述,我們必須清楚地知道一點:slf4j只是一個日誌標準,並不是日誌系統的具體實現。理解這句話非常重要,slf4j只做兩件事情:

  1. 提供日誌接口
  2. 提供獲取具體日誌對象的方法

slf4j-simple、logback都是slf4j的具體實現,log4j並不直接實現slf4j,但是有專門的一層橋接slf4j-log4j12來實現slf4j。

  1. 用法

在springmvc和maven環境下面。

    1. Maven裏面引入一下配置
<dependency>

  <groupId>org.slf4j</groupId>

  <artifactId>slf4j-api</artifactId>

  <version>1.7.30</version>

</dependency>



<dependency>

    <groupId>org.slf4j</groupId>

    <artifactId>slf4j-log4j12</artifactId>

    <version>1.7.30</version>

</dependency>

 

如果沒有maven的,請導入如下jar

 

    1. 編寫配置文件

配置log4j.propertier,可以使用log4j.xml進行配置。如果不去修改配置文件的默認位置,則需要把配置文件放到項目的根目錄下面,不然框架找不到日誌配置文件。

### 設置,文件必須放到這裏目錄###

### 把指定級別以上的日誌信息輸出到指定的一個或者多個位置。把DEBUG以上的日誌輸出到Console和File

#Console和File是自己自定義的名稱,可以配置更多需要輸出的目錄

#OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL 緊急程度依次降低。all裏面會包括了他上面的所有日誌。debug裏面會包含上面的所有日誌。

log4j.rootLogger = DEBUG,Console,File



### 輸出信息到控制擡 ###

log4j.appender.Console = org.apache.log4j.ConsoleAppender

log4j.appender.Console.Threshold = DEBUG

log4j.appender.Console.Target=System.out

log4j.appender.Console.Encoding=UTF-8

log4j.appender.Console.layout = org.apache.log4j.PatternLayout

log4j.appender.Console.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n



### 輸出DEBUG 級別以上的日誌到=E://logs/debug.log ###

log4j.appender.File = org.apache.log4j.DailyRollingFileAppender

#相對路徑,d:/logs/debug.log

#如果寫成這個:logs/debug.log ,那麼log文件就在: tomcat85\bin\logs目錄下面

#${log4jFileName}在項目啓動的時候設置了

log4j.appender.File.File = logs/${log4jFileName}/info.log

log4j.appender.File.Append = true

log4j.appender.File.Threshold = INFO

#一天生成一個日誌文件

log4j.appender.File.datePattern = '_'yyyy-MM-dd'.log'

log4j.appender.File.layout = org.apache.log4j.PatternLayout

log4j.appender.File.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

 

注意:低層級的日誌級別,會把比它高的級別日誌也打印出來。上面的配置可以實現出現DEBUG及以上的日誌時,在控制檯會顯示;出現了INFO及以上級別的日誌的時候,會把日誌保存在配置文件裏面,配置文件一天一個。

下面演示一種把配置文件放到指定位置,且修改了日誌文件的存放路徑。在項目加載的時候,動態修改日誌文件的配置文件的加載路徑,並在系統變量裏面加入一個日誌文件路徑變量:

public void initLog4j(ServletContextEvent servletContextEvent) {

        //獲取項目名稱

        String prefix = servletContextEvent.getServletContext().getRealPath("/");

        //在系統變量裏面設置log4jFilename,用來指定日誌文件的路徑

        System.setProperty("log4jFileName", servletContextEvent.getServletContext().getContextPath());

        String customerLog4jLocation = servletContextEvent.getServletContext().getInitParameter("log4jLocation");

        if (StringUtils.isEmpty(customerLog4jLocation)) {

            customerLog4jLocation = prefix + "WEB-INF\\classes\\log4j\\log4j.properties";

        } else {

            PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(new PathMatchingResourcePatternResolver());

            try {

                Resource[] resources = resolver.getResources(customerLog4jLocation);

                PropertyConfigurator.configure(resources[0].getInputStream());

                customerLog4jLocation = resources[0].getFile().getAbsolutePath();

            } catch (IOException e) {

                e.printStackTrace();

                customerLog4jLocation = prefix + "WEB-INF\\classes\\log4j\\log4j.properties";

            }

        }

        PropertyConfigurator.configure(customerLog4jLocation);

        logger.debug("lsx log4j properties location:" + customerLog4jLocation);

    }

 

    1. 在web裏面配置一個系統變量
<context-param>

        <param-name>log4jLocation</param-name>

        <!--重新定位log4j配置文件位置-->

        <param-value>classpath:log4j/log4j.properties</param-value>

</context-param>

 

    1. 代碼裏面使用
private final Logger log = LoggerFactory.getLogger(Main.class);



    public static void main(String[] args) {

        log.debug("debug");

        log.info("info");

        log.error("error");

}

 

以上配置文件,會讓生成的日誌文件在tomcat/bin/logs下面。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章