1. 程式人生 > >SpringBoot整合Slf4j+logback日誌框架

SpringBoot整合Slf4j+logback日誌框架

、Slf4j簡單介紹與優勢

1、介紹

  Slf4j的全稱是Simple Loging Facade For Java(Java簡單日誌門面),它僅僅是一個為Java程式提供日誌輸出的統一介面,並不是一個具體的日誌實現方案,就比如JDBC一樣,只是一種規則而已。所以單獨的Slf4j是不能工作的,必須搭配其他具體的日誌實現方案,比如apache的org.apache.log4j.Logger,jdk自帶的java.util.logging.Logger等。

 

2、優勢

  • 解耦客戶端

  Slf4j只是一種介面,它本身並不關心你底層使用的是什麼日誌實現方案,所以它支援各種日誌實現方案。簡單的說,只要我們在類庫中使用Slf4j打日誌,那麼底層使用什麼日誌實現方案是使用者決定的,怎麼決定?依靠配置檔案和jar庫。

  • 提高效率

  Slf4j列印日誌使用了{}佔位符,這樣就不會有字串拼接操作,減少了無用ring物件的數量,節省了記憶體,也提高了時間效率,同時編碼更加方便。

 

二、SpringBoot整合Slf4j+logback

  logback和log4j以及log4j2三者,推薦使用logback,因為logback的效率顯著高於log4j,而且logback也是Springboot推薦並且預設使用的日誌系統。

1、配置依賴

        <dependency>
            <groupId>ch.qos.logback</
groupId> <artifactId>logback-classic</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> </dependency>

2、配置logback

在  src\main\resources 路徑下建立logback.xml配置檔案。

<?xml version="1.0" encoding="utf-8"?>
<configuration scan="true" scanPeriod="10 seconds">

    <!-- 檔案輸出格式 -->
    <property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} -%5p ${PID:-} [%15.15t] %-40.40logger{39} : %m%n" />
    <property name="charsetEncoding" value="UTF-8" />
    <!--<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>-->

    <!--控制檯日誌-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${pattern}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="file" class="ch.qos.logback.core.FileAppender">
        <file>./logback/logfile.log</file>
        <append>true</append>
        <encoder>
            <pattern>${pattern}</pattern>
            <charset>${charsetEncoding}</charset>
        </encoder>
    </appender>

    <appender name="dailyRollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>./logback/log.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover -->
            <FileNamePattern>logback.%d{yyyy-MM-dd_HH}.log</FileNamePattern>
            <!-- keep 30 days' worth of history -->
            <maxHistory>7</maxHistory>
        </rollingPolicy>
        <encoder>
            <Pattern>${pattern}</Pattern>
        </encoder>
    </appender>

    <logger name="org.springframework.web" level="debug"/>
    <!-- show parameters for hibernate sql 專為 Hibernate 定製 -->
    <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
    <logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
    <logger name="org.hibernate.SQL" level="DEBUG" />
    <logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
    <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />

    <!--myibatis log configure-->
    <logger name="com.apache.ibatis" level="TRACE"/>
    <logger name="java.sql.Connection" level="DEBUG"/>
    <logger name="java.sql.Statement" level="DEBUG"/>
    <logger name="java.sql.PreparedStatement" level="DEBUG"/>

    <root level="debug">
        <appender-ref ref="console"/>
        <appender-ref ref="dailyRollingFileAppender"/>
        <appender-ref ref="file"/>
    </root>
</configuration>

3、配置檔案日誌

系統日誌全部寫在一個檔案會導致檔案越來越大,這時候可以用檔案日誌來切分控制檯日誌

<appender name="dailyRollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <File>/usr/local/log/app.log</File>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- daily rollover -->
        <FileNamePattern>logback.%d{yyyy-MM-dd}.log</FileNamePattern>
        <!-- keep 30 days' worth of history -->
        <maxHistory>30</maxHistory>
    </rollingPolicy>
    <encoder>
        <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</Pattern>
    </encoder>
</appender>

注:

logback.%d{yyyy-MM-dd}.log定義了日誌的切分方式——把每一天的日誌歸檔到一個檔案中,30表示只保留最近30天的日誌,以防止日誌填滿整個磁碟空間。同理,可以使用%d{yyyy-MM-dd HH:mm:ss SSS}來定義精確到分的日誌切分方式。

 

三、Springboot應用使用Slf4j+logback

示例:

@RestController
@RequestMapping("/Test")
public class HelloWorld {
    @Autowired
    private HelloService helloService;

    private final static Logger logger = LoggerFactory.getLogger(HelloWorld.class);
@GetMapping(
"/hello") public String sayHello(){ logger.info("hello Sfl4j + logback......"); return helloService.sayHello(); } }

執行效果: