springboot中使用logback


原文地址:https://blog.csdn.net/tianyaleixiaowu/article/details/73321610

Springboot默認集成的就是logback,logback相對來說是優秀於log4j的,log4j2也是參考了logback的設計。本篇就是來看看如何使用logback。

新建一個Springboot項目,勾選web就OK了,項目會自動集成logback。

控制台日志

寫一個controller測試一下:

 

  1.  
    import org.slf4j.Logger;
  2.  
    import org.slf4j.LoggerFactory;
  3.  
    import org.springframework.web.bind.annotation.GetMapping;
  4.  
    import org.springframework.web.bind.annotation.RestController;
  5.  
     
  6.  
    /**
  7.  
    * Created by admin on 17/6/16.
  8.  
    */
  9.  
    @RestController
  10.  
    public class IndexController {
  11.  
    private final Logger logger = LoggerFactory.getLogger(getClass());
  12.  
     
  13.  
    @GetMapping("/index")
  14.  
    public Object index() {
  15.  
    logger.debug( "debug");
  16.  
    logger.info( "info");
  17.  
    logger.warn( "warn");
  18.  
    logger.error( "error");
  19.  
    return "success";
  20.  
    }
  21.  
    }


需要注意:Logger是slf4j包中的logger,別引用錯了。slf4j是一個工廠,可以和log4j、logback結合使用,熟悉工廠模式的自然理解。引用了logback那么Logger就會使用logback相關的方法來處理日志,引用了log4j也同理,這樣能便於我們切換日志的實際處理類,這是工廠模式的優點。不要同時引用兩個日志處理框架,這樣工廠會懵逼的。

訪問上面的controller,查看控制台打印:

2017-06-16 09:54:13.966  INFO 60356 --- [nio-8080-exec-1] c.e.demo.controller.IndexController      : info
2017-06-16 09:54:13.967  WARN 60356 --- [nio-8080-exec-1] c.e.demo.controller.IndexController      : warn
2017-06-16 09:54:13.967 ERROR 60356 --- [nio-8080-exec-1] c.e.demo.controller.IndexController      : error

我們發現除了debug沒出來,其他的都出來了。

這是因為Springboot的日志level來控制的,根據不同的level來顯示。在哪里控制呢?正常來說,應該是由我們在resources下配置的spring-logback.xml來控制,但是我們什么都沒寫,那么他就走了Springboot默認的配置。

這里就是Springboot對logback配置的地方,base.xml里,可以看到root level=INFO,這個代表該項目默認是輸出最低為info級別的日志。然后看到有兩個append-ref,分別為console何file,這兩個分別對應上面引用的兩個include resource里的xml,每個名字對應一個處理類。

ConsoleAppender和FixedWindowRollingPolicy都是logback提供的兩個Appender處理類,Appender類代表了對日志的處理方法,這個可以自定義。系統提供了很多個Appender,基本滿足了大部分場景的需求,像Console就是輸出到控制台的,System.out.print之類的,而File的就是輸出到日志文件的。

剛才可以看到在控制台已經打印出了info及以上級別的日志了,那日志文件在哪里呢?

日志文件

上一段看到了默認的base.xml指定了ref為console和file,Console已經打印了,file卻沒有出現。下面就讓file出現。
在application.yml里加上:
logging:
  file: ./logback.log
這個是給日志文件起個名字,指定位置的。然后重新啟動項目,並訪問index,看看效果。
可以發現在項目外面多了一個文件logback.log,打開看看
發現和控制台的日志是一樣的。

修改其他配置

在yml文件里還可以配置其他的一些屬性
譬如我要修改level
logging:
  file: ./logback.log
  level:
    com.example.demo: debug
這樣可以指定不同的包使用不同的level。我指定了demo包level為debug,controller也在該包下,重啟項目訪問index,會發現debug的能顯示出來了。
這種配置可以細化,讓不同的包顯示不同的日志級別。
 

使用自定義配置

以上使用yml的配置功能比較少,要完成一些復雜配置,譬如在開發環境下和在生產環境下使用不同的level,使用自定義的Appender,那么就需要自定義配置。
 
在resources新建logback-spring.xml

修改日志級別

刪除yml對於level的配置,在xml文件里配置如下:
  1.  
    <?xml version="1.0" encoding="UTF-8"?>
  2.  
    <configuration>
  3.  
    <include resource="org/springframework/boot/logging/logback/base.xml" />
  4.  
     
  5.  
    <root level="WARN">
  6.  
    <appender-ref ref="CONSOLE" />
  7.  
    <appender-ref ref="FILE" />
  8.  
    </root>
  9.  
     
  10.  
     
  11.  
    </configuration>
這里引用了base.xml並覆蓋了root level為WARN,重啟項目,並訪問index


這下連Springboot啟動時的日志都沒有了,只剩下warn和error了.

按包名區分日志級別

  1.  
    <?xml version="1.0" encoding="UTF-8"?>
  2.  
    <configuration>
  3.  
    <include resource="org/springframework/boot/logging/logback/base.xml" />
  4.  
     
  5.  
    <root level="INFO">
  6.  
    <appender-ref ref="CONSOLE" />
  7.  
    <appender-ref ref="FILE" />
  8.  
    </root>
  9.  
     
  10.  
    <logger name="org.springframework.web" level="INFO"/>
  11.  
    <logger name="com.example.demo" level="WARN"/>
  12.  
    </configuration>
在xml里配置不同的包的日志level。結果自行測試。

按部署環境區分日志級別

我們可以在不同的環境配置不同日志級別,如dev環境下用INFO,prod環境下用ERROR。
 
  1.  
    <?xml version="1.0" encoding="UTF-8"?>
  2.  
    <configuration>
  3.  
    <include resource="org/springframework/boot/logging/logback/base.xml" />
  4.  
     
  5.  
    <root level="INFO">
  6.  
    <appender-ref ref="CONSOLE" />
  7.  
    <appender-ref ref="FILE" />
  8.  
    </root>
  9.  
     
  10.  
    <!-- 測試環境+開發環境. 多個使用逗號隔開. -->
  11.  
    <springProfile name="test,dev">
  12.  
    <logger name="org.springframework.web" level="INFO">
  13.  
    <appender-ref ref="FILE"/>
  14.  
    </logger>
  15.  
    <logger name="com.example" level="INFO" />
  16.  
    </springProfile>
  17.  
     
  18.  
    <!-- 生產環境. -->
  19.  
    <springProfile name="prod">
  20.  
    <logger name="org.springframework.web" level="ERROR">
  21.  
    <appender-ref ref="FILE"/>
  22.  
    </logger>
  23.  
    <logger name="com.example" level="ERROR" />
  24.  
    </springProfile>
  25.  
    </configuration>
寫法如上,然后在yml里配置spring.profiles.active = dev結果自行測試。

按時間自動滾動的日志文件

這個就需要自定義一個appender的配置文件了
  1.  
    <appender name="MY_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  2.  
    <Prudent>true</Prudent>
  3.  
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  4.  
    <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
  5.  
     
  6.  
    <maxHistory>30</maxHistory>
  7.  
    <totalSizeCap>3GB</totalSizeCap>
  8.  
     
  9.  
    </rollingPolicy>
  10.  
    <layout class="ch.qos.logback.classic.PatternLayout">
  11.  
    <Pattern> %d{yyyy-MM-dd HH:mm:ss} -%msg%n</Pattern>
  12.  
    </layout>
  13.  
    <encoder>
  14.  
    <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
  15.  
    </encoder>
  16.  
    </appender>
我們定義一個name為MY_FILE的appender,配置fileName策略為按年月日.log的文件名,然后就可以使用這個Appender了。
  1.  
    <!-- 測試環境+開發環境. 多個使用逗號隔開. -->
  2.  
    <springProfile name="test,dev">
  3.  
    <logger name="org.springframework.web" level="INFO">
  4.  
    <appender-ref ref="MY_FILE"/>
  5.  
    </logger>
  6.  
    </springProfile>

需要注意,Appender的定義要在上面,使用它的地方要在下面,不然會報錯找不到Appender。
定義好Appender后,就可以在任意的logger-name標簽下使用了。需要注意不能同名,譬如不能也叫FILE,和base.xml里重名是不可以的。
文件的生成策略可以有很多,按天分文件夾,按大小,按容量等等,可以自行查找配置。
Appender也有很多種,系統已經完成的有Console,File,SocketAppender,SMTPAppender,DBAppender等,可以往遠處服務器、數據庫、文件、郵件、控制台等輸出日志,功能強大。下一篇我會附一個系統已經完成的Appender說明。

自定義Appender

如果以上都不能滿足要求,需要自定義Appender,譬如我們希望把日志除了往文件、控制台外,再往mongoDB輸出一份,那么就需要自定義一個mongoAppender。回頭等我實驗好了,就弄一個mongoAppender。


免責聲明!

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



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