Logback日志学习
直接上代码
相关注释都在代码中
最后打印日志为异步按照日期输出不同等级的日志文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %c %M %L [%thread] %msg%n"></property>
<!-- 定义日志文件保存路径属性 -->
<property name="log_dir" value="/logs"></property>
<!-- 定义日志文件大小 -->
<property name="log_size" value="10MB"></property>
<!--格式化输出:
%d 表示日期,
%thread 表示线程名,
%-5level:级别从左显示5个字符宽度
%msg或%m:日志消息,
%n 是换行符
%d{yyyy-MM-dd HH:mm:ss.SSS} 日期
%c 类的完整名称
%L 行号
%M method方法
-->
<!-- 控制台输出 appender -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!--控制输出流对象 默认 .out 改为 .err -->
<target>System.err</target>
<!--日志消息格式配置-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<!--日志级别过滤器-->
<!--<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!–日志过滤规则–>
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>-->
</appender>
<!-- 日志文件输出的 appender -->
<!--<appender name="file" class="ch.qos.logback.core.FileAppender">
<!– 日志文件保存路径 –>
<file>${log_dir}/logback.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>-->
<!-- 日志HTML文件输出表格 appender -->
<!--<appender name="file_html" class="ch.qos.logback.core.FileAppender">
<!– 日志文件保存路径 –>
<file>${log_dir}/logback.html</file>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}%-5level%c%M%L%thread%msg</pattern>
</layout>
</encoder>
</appender>-->
<!--日志拆分和归档压缩的 appender-->
<!--<appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!– 日志文件保存路径 –>
<!– <file>${log_dir}/roll_logback.log</file>–>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<!–指定拆分规则–>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!–按照时间和压缩格式声明拆分的文件名–>
<fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!–按照文件大小拆分–>
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
<!–日志级别过滤器–>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!–日志过滤规则–>
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>-->
<!--INFO日志-->
<appender name="infoFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log_dir}/info.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>${log_size}</maxFileSize>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--DEBUG日志-->
<appender name="debugFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log_dir}/debug.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>${log_size}</maxFileSize>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--WARN日志-->
<appender name="warnFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log_dir}/warn.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>${log_size}</maxFileSize>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--TRACE日志-->
<appender name="traceFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log_dir}/trace.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>${log_size}</maxFileSize>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>TRACE</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--ERROR日志-->
<appender name="errorFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log_dir}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>${log_size}</maxFileSize>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--异步日志-->
<appender name="errorAsync" class="ch.qos.logback.classic.AsyncAppender">
<!-- 0 :不丢失日志; 默认如果队列已满会丢弃TRACE、DEBUG、INFO级别日志 -->
<discardingThreshold>0</discardingThreshold>
<appender-ref ref="errorFile"/>
</appender>
<appender name="warnAsync" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<appender-ref ref="warnFile"/>
</appender>
<appender name="infoAsync" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<appender-ref ref="infoFile"/>
</appender>
<appender name="debugAsync" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<appender-ref ref="debugFile"/>
</appender>
<appender name="traceAsync" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<appender-ref ref="traceFile"/>
</appender>
<!--root logger 配置 root 优先级低于 logger
TRACE < DEBUG < INFO < WARN < ERROR
-->
<root level="ALL">
<appender-ref ref="console"/>
</root>
<!--自定义logger
additivity="false" 自定义logger对象是否继承 rootLogger
-->
<logger name="com.zr" level="error" additivity="false">
<appender-ref ref="errorAsync"/>
</logger>
<logger name="com.zr" level="warn" additivity="false">
<appender-ref ref="warnAsync"/>
</logger>
<logger name="com.zr" level="info" additivity="false">
<appender-ref ref="infoAsync"/>
</logger>
<logger name="com.zr" level="debug" additivity="false">
<appender-ref ref="debugAsync"/>
</logger>
<logger name="com.zr" level="trace" additivity="false">
<appender-ref ref="traceAsync"/>
</logger>
<logger name="com.zr" level="all" additivity="false">
<appender-ref ref="console"/>
</logger>
</configuration>