我的例子
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="30 seconds" packagingData="true">
<!-- 设置 logger context 名称,一旦设置不可改变,默认为default -->
<contextName>EFDC</contextName>
<!-- 定义日志文件名称,与工程名一致 -->
<property name="APP_NAME" value="EFDC" />
<!-- 定义日志的根目录 可以手动指定绝对路径 如:<property name="LOG_HOME" value="绝对路径(用正斜杠代替反斜杠或者双反斜杠来分隔目录级次)" /> -->
<!--也可以用define标签自己在代码中动态指定根目录,LogHomeProperty类后面附上 -->
<define name="LOG_HOME" class="com.hkx.logging.util.LogHomeProperty" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{ HH:mm:ss.SSS} %-5level %logger{ 36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 正常文件输出设置 -->
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 活动文件 -->
<File>${ LOG_HOME}/${ APP_NAME}.log</File>
<!-- 日志滚动策略 -->
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 归档文件 -->
<FileNamePattern>${ LOG_HOME}/${ APP_NAME}/%d{ yyyy-MM-dd}-%i.zip
</FileNamePattern>
<!-- 单个日志文件最多 10MB -->
<maxFileSize>10MB</maxFileSize>
<!-- 30天的日志周期,超出数量就删除旧文件 -->
<maxHistory>30</maxHistory>
<!-- 日志体量上限,超出删除旧的日志 -->
<totalSizeCap>500MB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{ yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level - %msg%n</pattern>
</encoder>
</appender>
<!-- 异常文件输出设置,将异常堆栈另外保存一份到单独的文件中,方便查找 -->
<appender name="FILE_ERROR"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${ LOG_HOME}/${ APP_NAME}.error.log</File>
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<FileNamePattern>${ LOG_HOME}/${ APP_NAME}/error-%d{ yyyy-MM-dd}-%i.zip
</FileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>500MB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{ yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 -->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印警告日志 -->
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 异步输出 -->
<appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender">
<!-- 0-不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>256</queueSize>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref ="FILE"/>
</appender>
<!-- 日志级别若没显示定义,则继承最近的父logger(该logger需显示定义level,直到rootLogger)的日志级别-->
<!-- logger的appender默认具有累加性(默认日志输出到当前logger的appender和所有祖先logger的appender中),可通过配置 “additivity”属性修改默认行为-->
<logger name="com.jiuqi" level="INFO" additivity="false" >
<appender-ref ref="FILE"/>
</logger>
<!-- 至多只能配置一个root -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
<appender-ref ref="FILE_ERROR" />
</root>
</configuration>
LogHomeProperty 类要继承PropertyDefinerBase类
package com.hkx.logging.util;
import ch.qos.logback.core.PropertyDefinerBase;
public class LogHomeProperty extends PropertyDefinerBase{
private static final String LOG_HOME = 自己动态的定义根目录路径;
@Override
public String getPropertyValue() {
return LOG_HOME;
}
}
这里有大神的一篇超详细的说明 https://www.cnblogs.com/warking/p/5710303.html