Spring boot logback日志系统集成

Spring boot默认使用的日志就是logback,我们就以logback为基础搭建公用的log系统,并将其发不成为第三方jar包给其它的系统使用。
参考网址:
http://logback.qos.ch/manual/appenders.html#ConsoleAppender
http://logback.qos.ch/manual/filters.html#thresholdFilter

1.配置日志xml文件logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE >ALL -->
<configuration>
    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
    <property name="log.path" value="./logs" />
    <!--日志保存的有效时间(天)-->
    <property name="log.date" value="30" />
    <property name="pattern" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-10.10thread] [%-5level] [%-36.36logger{36}:%-4.4line] : %msg%n"></property>
    <property name="patternMsg" value="%msg%n"></property>
    <!-- 控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!-- 日志过滤级别 -->
            <level>INFO</level>
        </filter>
        <encoder>
            <!-- 格式化输出 -->
            <pattern>${pattern}</pattern>
            <!-- 输出编码 -->
            <charset>utf8</charset>
        </encoder>
    </appender>
    <!-- INFO日志文件输出 -->
    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 日志过滤级别 -->
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <!-- 格式化输出 -->
            <pattern>${pattern}</pattern>
            <!-- 输出编码 -->
            <charset>utf8</charset>
        </encoder>
        <!-- 文件存放路径 -->
        <file>${log.path}/info/info.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天归档 -->
            <fileNamePattern>${log.path}/info/info.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志存放周期(天) -->
            <maxHistory>${log.date}</maxHistory>
        </rollingPolicy>
    </appender>
    <!-- TRACE日志文件输出 -->
    <appender name="TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="com.yaomy.log.filter.EnhanceLevelFilter">
            <!-- 日志过滤级别 -->
            <level>TRACE</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <!-- 格式化输出 -->
            <pattern>${patternMsg}</pattern>
            <!-- 输出编码 -->
            <charset>utf8</charset>
        </encoder>
        <!-- 文件存放路径 -->
        <file>${log.path}/user/user_action.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天归档 -->
            <fileNamePattern>${log.path}/user/user_action.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志存放周期(天) -->
            <maxHistory>${log.date}</maxHistory>
        </rollingPolicy>
    </appender>
    <!-- ERROR日志文件输出 -->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 日志过滤级别 -->
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <!-- 格式化输出 -->
            <pattern>${pattern}</pattern>
            <!-- 输出编码 -->
            <charset>utf8</charset>
        </encoder>
        <!-- 文件存放路径 -->
        <file>${log.path}/error/error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天归档 -->
            <fileNamePattern>${log.path}/error/error.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志存放周期(天) -->
            <maxHistory>${log.date}</maxHistory>
        </rollingPolicy>
    </appender>
    <!-- WARN日志文件输出 -->
    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 日志过滤级别 -->
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <!-- 格式化输出 -->
            <pattern>${pattern}</pattern>
            <!-- 输出编码 -->
            <charset>utf8</charset>
        </encoder>
        <!-- 文件存放路径 -->
        <file>${log.path}/warn/warn.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天归档 -->
            <fileNamePattern>${log.path}/warn/warn.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志存放周期(天) -->
            <maxHistory>${log.date}</maxHistory>
        </rollingPolicy>
    </appender>
    <!-- DEBUG日志文件输出 -->
    <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 日志过滤级别 -->
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <!-- 格式化输出 -->
            <pattern>${pattern}</pattern>
            <!-- 输出编码 -->
            <charset>utf8</charset>
        </encoder>
        <!-- 文件存放路径 -->
        <file>${log.path}/debug/debug.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天归档 -->
            <fileNamePattern>${log.path}/debug/debug.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志存放周期(天) -->
            <maxHistory>7</maxHistory>
        </rollingPolicy>
    </appender>
    <!-- 基础日志输出级别,大于等于level,不过跟filter中的是冲突的,只有一个生效,默认filter优先级更高 -->
    <root level="TRACE">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="ERROR"/>
        <appender-ref ref="WARN"/>
        <appender-ref ref="INFO"/>
        <appender-ref ref="DEBUG"/>
        <appender-ref ref="TRACE"/>
    </root>
</configuration>

上面的日志配置输出五种日志文件,并且日志文件每天自动滚动成一个文件,可以控制文件保存的有效期;其中输出控制台的日志文件使用的过滤器是阈值过滤器ThresholdFilter,
其它的使用的是级别过滤器LevelFilter,有一种特殊的日志TRACE使用的是自定义的过滤器EnhanceLevelFilter,主要是用来生成用户自定义的JSON格式日志文件

2.看下自定义过滤器EnhanceLevelFilter
package com.yaomy.log.filter;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.filter.LevelFilter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.spi.FilterReply;

public class EnhanceLevelFilter extends LevelFilter {

    Level level;

    @Override
    public FilterReply decide(ILoggingEvent event) {
        if (event.getMessage().startsWith("{")
                && event.getMessage().endsWith("}")
                && event.getLevel().equals(level)) {
            return FilterReply.ACCEPT;
        } else {
            return FilterReply.DENY;
        }
    }
    @Override
    public void setLevel(Level level) {
        this.level = level;
    }
    @Override
    public void start() {
        if (this.level != null) {
            super.start();
        }
    }
}

自定义过滤器是LevelFilter的一个子类,是为了满足特殊需求定义的

3.接下来看下我们封装的工具类
package com.yaomy.log.utils;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yaomy.log.po.UserAction;
import org.slf4j.LoggerFactory;

/**
 * @Description: 日志工具类 日志级别总共有TARCE < DEBUG < INFO < WARN < ERROR < FATAL,且级别是逐渐提供,
 * 如果日志级别设置为INFO,则意味TRACE和DEBUG级别的日志都看不到。
 * @Version: 1.0
 */
public class LoggerUtil {

    public static <T> void info(Class<T> clazz, String msg){
        LoggerFactory.getLogger(clazz).info(msg);
    }

    public static <T> void warn(Class<T> clazz, String msg){
        LoggerFactory.getLogger(clazz).warn(msg);
    }

    public static <T> void debug(Class<T> clazz, String msg){
        LoggerFactory.getLogger(clazz).debug(msg);
    }

    public static <T> void error(Class<T> clazz, String msg){
        LoggerFactory.getLogger(clazz).error(msg);
    }

    public static void user(UserAction userAction){
        try {
            ObjectMapper objectMapper = new ObjectMapper();
            LoggerFactory.getLogger(LoggerUtil.class).trace(objectMapper.writeValueAsString(userAction));
        } catch (JsonProcessingException e){
            error(LoggerUtil.class, e.toString());
            System.out.println("----------");
        }
    }

}
4.自定义的UserAction类
package com.yaomy.log.po;


import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.io.Serializable;

@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY, getterVisibility=JsonAutoDetect.Visibility.NONE)
public class UserAction implements Serializable {
    //重命名
    @JsonProperty("NUMBER")
    private String number;
    @JsonProperty("USERNAME")
    private String username;

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}
5.测试日志
package com.yaomy.log;


import com.yaomy.log.po.UserAction;
import com.yaomy.log.utils.LoggerUtil;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class LogBootStrap {
    public static void main(String[] args) {
        SpringApplication.run(LogBootStrap.class, args);
        LoggerUtil.info(LogBootStrap.class,"sfddsf-----------------");
        LoggerUtil.info(LogBootStrap.class,"{username:liming}");
        LoggerUtil.error(LogBootStrap.class,"-----------error------------");
        LoggerUtil.warn(LogBootStrap.class,"----------warn--------------");
        LoggerUtil.debug(LogBootStrap.class,"---------------debug-");
        UserAction userAction = new UserAction();
        userAction.setUsername("dsdf");
        userAction.setNumber("12");
        LoggerUtil.user(userAction);
    }
}

日志配置好之后就可以单独的将其达成jar包给其它系统来使用,也可以给其它的module使用

GitHub源码:https://github.com/mingyang66/spring-parent/tree/master/spring-boot-control-logback-service

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值