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"?>
<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>
<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}"/>
<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>
<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="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="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