Logback简介
Logback 继承自 log4j。
Logback 的架构非常的通用,适用不同的使用场景。Logback 被分成三个不同的模块:logback-core,logback-classic,logback-access。
logback-core 是其它两个模块的基础。logback-classic 模块可以看作是 log4j 的一个优化版本,它天然的支持 SLF4J,所以你可以随意的从其它日志框架(例如:log4j 或者 java.util.logging)切回到 logack。
logback-access 可以与 Servlet 容器进行整合,例如:Tomcat、Jetty。它提供了 http 访问日志的功能。
Logback的Appender
logback 将写入日志事件的任务委托给一个名为 appender 的组件。所以appender代表日志任务,理所当然我们的INFO、ERROR、DEBUG等日志输出在appender里边定义。
基于xml配置Appender
<configuration>
//这里涉及到name和class两个属性,name是该日志任务的名字,可以随便起,需要和下边的root标签appender-ref对应。
//class是一个比较重要的属性,根据不同的日志level配置不同的class
//例子:控制台输出的对应class:ch.qos.logback.core.ConsoleAppender
//debug、error、warn对应class:ch.qos.logback.core.rolling.RollingFileAppender
<appender name="console" class="ch.qos.logback.core.ConsoleAppender" >
<!-- encoder 默认使用 ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="console" />
</root>
</configuration>
Rolling policy 简介
Rolling policy 负责轮转的方式,按照时间和文件大小轮转需要用到Rolling policy。
基于xml配置Rolling policy
<configuration debug="true">
<appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>mylog.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
//日志名称,按天轮转
<fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
//保存时间60天,60天之后自动清除以前日志
<maxHistory>60</maxHistory>
//限制归档文件总的大小
<totalSizeCap>20GB</totalSizeCap>
//检测者,mylog.log文件大小到达100MB,执行上边的策略
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
//文件大小100MB,满了之后自动创建文件存储这些日志
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="debug" />
</root>
</configuration>
Logback的Encoder
encoder 负责将日志事件转换为字节数组,并将字节数组写入到合适的 OutputStream 中。所以encoder负责日志输出的
基于xml配置Encoder
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>foo.log</file>
<encoder>
//日志输出的格式
<pattern>%d %-5level [%thread] %logger{0}: %msg%n</pattern>
//默认文件尾部追加日志,开启文件头部追加日志
<outputPatternAsHeader>true</outputPatternAsHeader>
</encoder>
</appender>
Logback的logger和root节点搭配使用
encoder 负责将日志事件转换为字节数组,并将字节数组写入到合适的 OutputStream 中。所以encoder负责日志输出的
基于xml配置logger和root
//logger标签 additivity默认为true会向上传递日志,name表示监控的包,触发日志时间上传root,调用appender-ref的日志任务
<logger name="org.springframework" level="debug" additivity="false">
<appender-ref ref="debug"/>
</logger>
<logger name="com.lzy.logdemo" level="debug"/>
<root level="INFO">
<appender-ref ref="console"/>
<appender-ref ref="debug"/>
</root>
logback.xml的整体配置
<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="10 seconds" debug="false">
<!-- set env -->
<property name="LOGDROOT" value="${user.home}"/><!--电脑User用户目录-->
<property name="APP_NAME" value="XM"/><!--项目名称-->
<!--日志路径-->
<property name="DEBUG_LOG_PATH" value="${LOGDROOT}/logs/${APP_NAME}_debug"/>
<property name="INFO_LOG_PATH" value="${LOGDROOT}/logs/${APP_NAME}_info"/>
<property name="WARN_LOG_PATH" value="${LOGDROOT}/logs/${APP_NAME}_warn"/>
<property name="ERROR_LOG_PATH" value="${LOGDROOT}/logs/${APP_NAME}_error"/>
<property name="DAY_LOG_PATH" value="${LOGDROOT}/logs/${APP_NAME}"/>
<!--日志输出格式-->
<property name="LOG_PATTERN_CONSOLE"
value="[%d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c:%L] [%thread] [%X{traceId}] %m%n"/>
<property name="LOG_PATTERN_FILE"
value="[%d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c:%L] [%thread] [%X{traceId}] %m%n"/>
<property name="CALC_BILL_LOG_PATTERN_FILE" value="%m%n"/>
<!--可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件,假设设置每个月滚动,删除之前的旧文件-->
<property name="MAXHISTORY" value="30"/>
<!--设置日志存储最大值-->
<property name="MAXFILESIZE" value="500MB"/>
<!-- 性能相关 -->
<property name="PERF_LOG_PATH" value="${LOGDROOT}/logs/${APP_NAME}_perf"/>
<!-- set context name -->
<contextName>${APP_NAME}</contextName>
<!-- console -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder charset="UTF-8">
<pattern>${LOG_PATTERN_CONSOLE}</pattern>
</encoder>
</appender>
<!-- debug level -->
<appender name="debug"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- file name -->
<File>${DEBUG_LOG_PATH}.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--output file name -->
<fileNamePattern>${DEBUG_LOG_PATH}.%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<!-- MAXHISTORY days old files will be delete -->
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${MAXFILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>${LOG_PATTERN_FILE}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- info level -->
<appender name="info"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${INFO_LOG_PATH}.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${INFO_LOG_PATH}.%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${MAXFILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>${LOG_PATTERN_FILE}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- warn level -->
<appender name="warn"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${WARN_LOG_PATH}.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${WARN_LOG_PATH}.%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${MAXFILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>${LOG_PATTERN_FILE}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- error level -->
<appender name="error"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${ERROR_LOG_PATH}.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ERROR_LOG_PATH}.%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${MAXFILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>${LOG_PATTERN_FILE}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 每日输出 -->
<appender name="day_log"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${DAY_LOG_PATH}.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${DAY_LOG_PATH}.%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${MAXFILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>${LOG_PATTERN_FILE}</pattern>
</encoder>
</appender>
<!-- 异步输出 -->
<appender name="dayLogAsyncAppender" class="ch.qos.logback.classic.AsyncAppender">
<includeCallerData>true</includeCallerData>
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>512</queueSize>
<appender-ref ref="day_log"/>
</appender>
<!-- spring -->
<logger name="org.springframework" level="info"/>
<logger name="com.dome" level="info" additivity="false">
<appender-ref ref="error"/>
<appender-ref ref="warn"/>
<appender-ref ref="console"/>
</logger>
<!-- lookback -->
<logger name="lookbackLogger" level="info" additivity="false">
<appender-ref ref="console"/>
<appender-ref ref="lookbackAppender"/>
</logger>
<!-- root -->
<root level="info">
<appender-ref ref="info"/>
<appender-ref ref="warn"/>
<appender-ref ref="error"/>
<appender-ref ref="console"/>
</root>
</configuration>