最近新接手个项目,生产环境报错要查日志定位bug时,发现所有级别的日志全部输出在一个文件里,导致文件臃肿,并且难以浏览文件和定位错误日志。于是重改日志输出,最终决定使用slf4j+logback来做日志输出。
Simple Logging Facade for Java (SLF4J) 充当各种日志框架(例如 java.util.logging、logback、log4j)的简单外观或抽象,允许最终用户在部署 时插入所需的日志框架。如果项目中使用了Lombok插件,则直接在类前加上@Slf4j注解即可,否则需要引入一下依赖:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<!--使用Lombok时不用引入-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
</dependency>
然后在resources下新建logback.xml文件
<?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="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<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>
</encoder>
</appender>
<!-- 日志记录器,日期滚动记录 -->
<appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>/home/iot/sdmchome/logs/error.log</file>
<!--开发环境可以使用这个配置测试,测试时会在本地项目生成log文件夹-->
<!--<file>log/error.log</file>-->
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>/home/iot/sdmchome/logs/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>
<!-- 此日志文件只记录error级别的 -->
<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>/home/iot/sdmchome/logs/info.log</file>
<!--开发环境可以使用这个配置测试,测试时会在本地项目生成log文件夹-->
<!--<file>log/info.log</file>-->
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>/home/iot/sdmchome/logs/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="STDOUT" />
<appender-ref ref="FILEERROR" />
<appender-ref ref="FILEINFO" />
</root>
</configuration>