SLF4J+LogBack实现不同级别的日志输出到不同文件

前言

在项目开发中往往需要将不同的级别,不同包,不同接口的日志输出到不同的文件中,在利用SLF4J+LogBack实现此功能在配置文件中根据不同的级别,包,接口配置不同的appender日志记录器。

1.LogBack配置文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">

	<!-- 日志编码 -->
	<property name="CHARSET" value="utf-8"></property>
	<!-- 日志记录格式 -->
	<property name="ERROR_PATTERN"
		value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L-%msg%n" />
	<property name="INFO_PATTERN"
		value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L-%msg%n" />

	<!-- 日志记录器,日期滚动记录 -->
	<appender name="FILEERROR"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!-- 正在记录的日志文件的路径及文件名 -->
		<file>log/log_error.log</file>
		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
		<rollingPolicy
			class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
			<fileNamePattern>log/error/log-error-%d{yyyy-MM-dd}.%i.log
			</fileNamePattern>
			<maxFileSize>6MB</maxFileSize>
			<maxHistory>30</maxHistory>
		</rollingPolicy>
		<!-- 追加方式记录日志 -->
		<append>true</append>
		<!-- 日志文件的格式 -->
		<encoder
			class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<pattern>${ERROR_PATTERN}</pattern>
			<charset>${CHARSET}</charset>
		</encoder>
		<!-- 此日志文件只记录info级别的 -->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>error</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
	</appender>

	<!-- 日志记录器,日期滚动记录 -->
	<appender name="FILEINFO"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!-- 正在记录的日志文件的路径及文件名 -->
		<file>log/log_info.log</file>
		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
		<rollingPolicy
			class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
			<fileNamePattern>log/info/log-info-%d{yyyy-MM-dd}.%i.log
			</fileNamePattern>
			<maxFileSize>6MB</maxFileSize>
			<maxHistory>30</maxHistory>
		</rollingPolicy>
		<!-- 追加方式记录日志 -->
		<append>true</append>
		<!-- 日志文件的格式 -->
		<encoder
			class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<pattern>${ERROR_PATTERN}</pattern>
			<charset>${CHARSET}</charset>
		</encoder>
		<!-- 此日志文件只记录info级别的 -->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>info</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
	</appender>

	<root level="INFO">
		<appender-ref ref="FILEERROR" />
		<appender-ref ref="FILEINFO" />
	</root>

</configuration>

对LogBack各个节点的详细介绍可以看Albin的文章>>

2.日志测试类

public class LogService {

	private Logger logger = LoggerFactory.getLogger(this.getClass());
	
	public void logMethod() {
		try {
			logger.info("Method start");
			throw new Exception("Method get out a error");
		}catch(Exception e) {
			logger.error(e.getMessage());
		}
	}
}

Junit测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class LogServiceTest {

	@Test
	public void logtest() {
		LogService test = new LogService();
		test.logMethod();
	}
}

3.日志输出结果

log_info.log

2019-08-01 16:22:54.580 INFO  com.example.demo.logservice.LogService Line:12 -Method start

log_error.log

2019-08-01 16:22:54.581 ERROR com.example.demo.logservice.LogService Line:15 -Method get out a error
经验分享 程序员 微信小程序 职场和发展