logback按日志级别多文件输出
最近开发了不少项目,因为想把错误日志单独输出到另一个文件中,所以好好研究了下logback日志,在此记录下。
本文主要解决两个问题
- springboot使用使用不同日志配置文件
- 不同级别日志多文件输出
- 某个模块的日志单独输出到一个日志文件
springboot使用使用不同日志配置文件
- 在springboot的application.properties配置文件(application.yml同理)添加logging.config=classpath:logback-debug.xml
- 在src/java/resources下创建logback-debug.xml
不同级别日志多文件输出及某个模块的日志单独输出到一个日志文件
日志多文件输出场景
- 先说一个需求,然后根据需求引出配置,讲解配置。
- 需求:info及以上级别的日志输出到一个文件,warn及以上级别的日志输出到另外一个文件。
XML配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 -->
<property name="LOG_HOME" value="/home/logs" />
<property name="AppName" value="demo" />
<!-- 日志输出格式 -->
<!--格式化输出:%d{yyyy-MM-dd HH:mm:ss.SSS}表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,[%method,%line]:方法名及行号,%msg:日志消息,%n:换行符 -->
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
<!-- 控制台输出 -->
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<encoder
class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="INFO_FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${AppName}.info.log</file>
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名 -->
<FileNamePattern>${LOG_HOME}/${AppName}.info.%d{yyyy-MM-dd}.%i.log
</FileNamePattern>
<!--日志文件保留天数 -->
<MaxHistory>30</MaxHistory>
<maxFileSize>100MB</maxFileSize>
</rollingPolicy>
<encoder
class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="ERROR_FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${AppName}.error.log</file>
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名 -->
<FileNamePattern>${LOG_HOME}/${AppName}.error.%d{yyyy-MM-dd}.%i.log
</FileNamePattern>
<!--日志文件保留天数 -->
<MaxHistory>30</MaxHistory>
<maxFileSize>100MB</maxFileSize>
</rollingPolicy>
<encoder
class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${log.pattern}</pattern>
</encoder>
<!-- 允许打印警告日志到文件的过滤器 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>NEUTRAL</onMismatch>
</filter>
<!-- 允许打印错误日志到文件的过滤器 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- onMatch,onMismatch取值及含义 -->
<!-- DENY:日志将立即被抛弃不再经过其他过滤器,最后一个filter的onMismatch使用 -->
<!-- NEUTRAL:有序列表里的下个过滤器过接着处理日志,非最后一个filter的onMismatch使用 -->
<!-- ACCEPT:日志会被立即处理,不再经过剩余过滤器,所有filter的onMatch使用 -->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 单独输出到一个日志文件 -->
<appender name="SINGLE_FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${AppName}.info.log</file>
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名 -->
<FileNamePattern>${LOG_HOME}/${AppName}.info.%d{yyyy-MM-dd}.%i.log
</FileNamePattern>
<!--日志文件保留天数 -->
<MaxHistory>30</MaxHistory>
<maxFileSize>100MB</maxFileSize>
</rollingPolicy>
<encoder
class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!--myibatis log configure -->
<logger name="com.apache.ibatis" level="TRACE" />
<logger name="java.sql.Connection" level="DEBUG" />
<logger name="java.sql.Statement" level="DEBUG" />
<logger name="java.sql.PreparedStatement" level="DEBUG" />
<!--该路径的日志文件单独按SINGLE_FILE的设置输出到另外的文件中-->
<logger name="c.o.m.n" level="INFO" additivity="false">
<appender-ref ref="SINGLE_FILE"/>
</logger>
<logger name="c.o.m" level="INFO" />
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
</configuration>
标签组件
- 定义打印组件
<appender>
...
</appender>
- 定义指定包路径日志级别
<logger name="c.o.m" level="INFO" />
- 日志关联打印组件
<root><appender-ref ref="STDOUT" /></root>
控制日志输出到不同文件的关键标签filter讲解
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>NEUTRAL</onMismatch>
</filter>
- level:拦截的日志级别
- onMatch:匹配level后的处理方式
- onMismatch:未匹配level后的处理方式
- onMatch和onMismatch取值说明
DENY:日志将立即被抛弃不再经过其他过滤器,最后一个filter的onMismatch使用
NEUTRAL:有序列表里的下个过滤器过接着处理日志,非最后一个filter的onMismatch使用
ACCEPT:日志会被立即处理,不再经过剩余过滤器,所有filter的onMatch使用