spring boot logback 自定义日志

maven

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

application.yml

# 应用名称
spring:
  application:
    name: demologback

  # 应用服务 WEB 访问端口
server:
  port: 8080

logging:
  config: classpath:logback-spring.xml

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="10 seconds">
    <!-- 设置属性,文件中使用 ${} 获取属性值 -->
    <!-- 项目名称 -->
    <springProperty scope="context" name="projectName" source="spring.application.name"/>
    <springProperty scope="context" name="logPath" source="log.path" defaultValue="\log"/>
    <springProperty scope="context" name="logging.level.root" source="logging.level.root" defaultValue="info"/>
    <contextName>${projectName}</contextName>
      <!--log日志格式-->
    <property name="PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>

    <!-- INFO 日志 -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${logPath}/${projectName}/log_info.log</file>
        <encoder>
            <pattern>${PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logPath}/${projectName}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    
    <!-- 自定义 日志 -->
    <appender name="logerUser" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${logPath}/${projectName}/logerUser.log</file>
        <encoder>
            <Pattern>%d{HH:mm:ss.SSS} [%thread] [%X{param}] %-5level %logger{36} - %msg%n</Pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<!--        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">-->
<!--        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">-->
        <rollingPolicy class="com.example.demologback.SampleTimeBasedRollingPolicy">
            <fileNamePattern>${logPath}/${projectName}/logerUser-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>1KB</maxFileSize>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
         <filter class="com.example.demologback.SampleFilter">
            <level>INFO</level>
            <marker>loggerMarker</marker>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!--
        root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
        不能设置为INHERITED或者同义词NULL。默认是DEBUG
        可以包含零个或多个元素,标识这个appender将会添加到这个logger。

        nico:设置level级别后,磁盘上低级别的日志文件里没有任何内容,控制台也是一样不会输出
    -->
    <root level="DEBUG">
    	<appender-ref ref="INFO_FILE"/>
        <appender-ref ref="logerUser"/>
    </root>
</configuration>

demoController.java

package com.example.demologback;

import org.slf4j.*;
import org.springframework.web.bind.annotation.*;

@RestController
public class demoController {
    private static final Logger logger = LoggerFactory.getLogger(demoController.class);
    private static final   Logger loggerUser= LoggerFactory.getLogger("logerUser");
    private static Marker marker  = MarkerFactory.getMarker("loggerMarker");
    @RequestMapping(value = "/demo",method = RequestMethod.GET)
    public String getDemo(String  param)
    {
        logger.info(param);
        MDC.put("param", param);
        loggerUser.info(param);

        logger.info(marker,param);
        MDC.remove("param");
        return  param;
    }
}


SampleFilter

package com.example.demologback;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.AbstractMatcherFilter;
import ch.qos.logback.core.spi.FilterReply;
import org.slf4j.Marker;
import org.slf4j.MarkerFactory;

public class SampleFilter  extends AbstractMatcherFilter<ILoggingEvent> {
    Marker marker;
    Level level;

    public SampleFilter() {
    }
    @Override
    public void start() {
        if (this.marker != null) {
            super.start();
        } else {
            this.addError("The marker property must be set for [" + this.getName() + "]");
        }

    }

    @Override
    public FilterReply decide(ILoggingEvent iLoggingEvent) {
        if (!this.isStarted()) {
            return FilterReply.NEUTRAL;
        } else if (iLoggingEvent.getMarker() == null) {
            return this.onMismatch;
        } else {
            return iLoggingEvent.getLevel().equals(this.level)&& iLoggingEvent.getLevel().equals(this.level) ? this.onMatch : this.onMismatch;
        }

    }


    public void setMarker(String markerStr) {
        if (markerStr != null) {
            this.marker = MarkerFactory.getMarker(markerStr);
        }

    }
    public void setLevel(Level level) {
        this.level = level;
    }

}

SizeAndTimeBasedRollingPolicy

package com.example.demologback;

import ch.qos.logback.core.rolling.RolloverFailure;
import ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy;
import ch.qos.logback.core.rolling.helper.CompressionMode;
import ch.qos.logback.core.rolling.helper.FileFilterUtil;
import ch.qos.logback.core.rolling.helper.RenameUtil;


public class SampleTimeBasedRollingPolicy<E> extends SizeAndTimeBasedRollingPolicy{
    RenameUtil renameUtil = new RenameUtil();
    @Override
    public void rollover() throws RolloverFailure {

       super.rollover();
        String elapsedPeriodsFileNameSrc = getTimeBasedFileNamingAndTriggeringPolicy().getElapsedPeriodsFileName();

        String elapsedPeriodStem = FileFilterUtil.afterLastSlash(elapsedPeriodsFileNameSrc);
        System.out.println(elapsedPeriodStem);
        System.out.println(elapsedPeriodsFileNameSrc);
        String finalName="";
        int end = elapsedPeriodStem.lastIndexOf(".");
        int start= elapsedPeriodStem.indexOf(".",end-2)+1;
        if(end>start)
        {
            String tmpInt=elapsedPeriodStem.substring(start,end);
            String format = String.format("%02d", Integer.valueOf(tmpInt)+1);
            finalName=elapsedPeriodStem.substring(0,start).concat(format).concat(elapsedPeriodStem.substring(end));
        	renameUtil.renameByCopying(elapsedPeriodsFileNameSrc,elapsedPeriodsFileNameSrc.replace(elapsedPeriodStem,finalName));
        }
        System.out.println(finalName);
        

    }

}

显示结果

14:42:46.621 [http-nio-8080-exec-1] [1] INFO  lggerUser - 1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值