springboot整合logback(service和controller和error日誌區分保存)

一、logback-spring.xml

<configuration>
    <!-- 屬性文件:在properties文件中找到對應的配置項 -->
    <springProperty scope="context" name="logging.path"  source="logging.path"/>
    <springProperty scope="context" name="logging.level" source="logging.level.com.glmapper.spring.boot"/>
    <!-- 默認的控制檯日誌輸出,一般生產環境都是後臺啓動,這個沒太大作用 -->
    <appender name="STDOUT"
              class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%d{HH:mm:ss.SSS} %-5level %logger{80} - %msg%n</Pattern>
        </encoder>
    </appender>

    <appender name="GLMAPPER-CONTROLLER"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <append>true</append>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <!-- 如果命中就禁止這條日誌 -->
            <onMatch>DENY</onMatch>
            <!-- 如果沒有命中就使用這條規則 -->
            <onMismatch>ACCEPT</onMismatch>
        </filter>

        <file>
            ${logging.path}/glmapper-spring-boot/glmapper-controller.log
        </file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${logging.path}/glmapper-spring-boot/glmapper-controller.log.%d{yyyy-MM-dd}</FileNamePattern>
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 錯誤日誌 appender : 按照每天生成日誌文件 -->
    <appender name="ERROR-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <append>true</append>
        <!-- 過濾器,只記錄 error 級別的日誌 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>error</level>
        </filter>
        <!-- 日誌名稱 -->
        <file>${logging.path}/glmapper-spring-boot/glmapper-error.log</file>
        <!-- 每天生成一個日誌文件,保存30天的日誌文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日誌文件輸出的文件名:按天回滾 daily -->
            <FileNamePattern>${logging.path}/glmapper-spring-boot/glmapper-error.log.%d{yyyy-MM-dd}</FileNamePattern>
            <!--日誌文件保留天數-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日誌消息,%n是換行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <!-- 編碼 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <!--打印日誌到glmapper-service.log的appender-->
    <appender name="GLMAPPER-SERVICE"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <append>true</append>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>${logging.level}</level>
        </filter>
        <file>
            ${logging.path}/glmapper-spring-boot/glmapper-service.log
        </file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${logging.path}/glmapper-spring-boot/glmapper-service.log.%d{yyyy-MM-dd}</FileNamePattern>
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <logger name="com.example.demo.controller" level="${logging.level}"
            additivity="false">
        <appender-ref ref="GLMAPPER-CONTROLLER" />
        <appender-ref ref="ERROR-APPENDER" />
    </logger>
    <!--此logger約束將.service包下的日誌輸出到GLMAPPER-SERVICE,錯誤日誌輸出到GERROR-APPENDE;GERROR-APPENDE見上面-->
    <logger name="com.example.demo.service" level="${logging.level}" additivity="false">
        <appender-ref ref="GLMAPPER-SERVICE" />
        <appender-ref ref="ERROR-APPENDER" />
    </logger>

    <root level="${logging.level}">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

二、application.properties

#設置應用的日誌級別
logging.level.com.glmapper.spring.boot=INFO
#路徑
logging.path=./logs

三、TeacherController

package com.example.demo.controller;

import com.example.demo.pojo.Teacher;
import com.example.demo.service.TeacherService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TeacherController {
    private static final Logger LOGGER =
            LoggerFactory.getLogger(TeacherController.class);
    @Autowired
    private TeacherService teacherService;

    @RequestMapping("/getTeacherById")
    public Teacher getTeacherById(@RequestBody Teacher teacher){
        LOGGER.info("我是TeacherController【INFO】teacher{}",teacher.toString());
        LOGGER.error("我是TeacherController【ERROR】teacher{}",teacher.toString());
        return teacherService.getTeacherById(teacher.getTid());
    }
}

四、TeacherServiceImpl

package com.example.demo.service.impl;

import com.example.demo.controller.TeacherController;
import com.example.demo.mapper.TeacherMapper;
import com.example.demo.pojo.Teacher;
import com.example.demo.service.TeacherService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


@Service
public class TeacherServiceImpl implements TeacherService {
    private static final Logger LOGGER =
            LoggerFactory.getLogger(TeacherServiceImpl.class);
    @Autowired
    private TeacherMapper teacherMapper;
    @Override
    public Teacher getTeacherById(Integer tid) {
        LOGGER.info("我是TeacherServiceImpl【INFO】--tid{}",tid);
        LOGGER.error("我是TeacherServiceImp【ERROR】---tid{}",tid);
        return teacherMapper.getTeacherById(tid);
    }
}

五、項目結構

參考文檔: https://juejin.im/post/6844903641535479821#heading-0

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