@Plugin(name = "thread", category = StrLookup.CATEGORY)
public class ThreadLookup implements StrLookup{
@Override
public String lookup(String key) {
return Thread.currentThread().getName();
}
@Override
public String lookup(LogEvent event, String key) {
return event.getThreadName() ==null ? Thread.currentThread().getName() : event.getThreadName();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!--status="WARN" :用于设置log4j2自身内部日志的信息输出级别,默认是OFF-->
<!--monitorInterval="30" :间隔秒数,自动检测配置文件的变更和重新配置本身-->
<configuration status="WARN" monitorInterval="30">
<appenders>
<!--这个输出控制台的配置-->
<Console name="STDOUT">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
<!-- 输出日志的格式-->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level [%logger{50}:%L] - %msg%n"
charset="UTF-8"/>
</Console>
<Routing name="FILE-INFO-${thread:threadName}">
<Routes pattern="$${thread:threadName}">
<Route>
<RollingRandomAccessFile name="FILE-INFO-${thread:threadName}"
fileName="logs/trace-info-${thread:threadName}.log"
filePattern="logs/trace-info-${thread:threadName}.%d{yyyy-MM-dd}.log">
<!--只输出info级别信息-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level [%logger{50}:%L] %logger{50} - %msg%n"
charset="UTF-8"/>
<Policies>
<!--时间策略,每隔24小时产生新的日志文件-->
<TimeBasedTriggeringPolicy/>
<!--大小策略,每到10M时产生新的日志文件-->
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
<DefaultRolloverStrategy max="1">
<Delete basePath="logs" maxDepth="2">
<IfFileName glob="*trace-info.*.log"/>
<IfLastModified age="1d"/>
</Delete>
</DefaultRolloverStrategy>
</RollingRandomAccessFile>
</Route>
</Routes>
</Routing>
<Routing name="FILE-DEBUG-${thread:threadName}">
<Routes pattern="$${thread:threadName}">
<Route>
<RollingRandomAccessFile name="FILE-DEBUG-${thread:threadName}"
fileName="logs/trace-debug-${thread:threadName}.log"
filePattern="logs/trace-debug-${thread:threadName}.%d{yyyy-MM-dd}.log">
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level [%logger{50}:%L] %logger{50} - %msg%n"
charset="UTF-8"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
<DefaultRolloverStrategy max="1">
<Delete basePath="logs" maxDepth="2">
<IfFileName glob="*trace-debug.*.log"/>
<IfLastModified age="1d"/>
</Delete>
</DefaultRolloverStrategy>
</RollingRandomAccessFile>
</Route>
</Routes>
</Routing>
<Routing name="FILE-WARN-${thread:threadName}">
<Routes pattern="$${thread:threadName}">
<Route>
<RollingRandomAccessFile name="FILE-WARN-${thread:threadName}"
fileName="logs/trace-warn-${thread:threadName}.log"
filePattern="logs/trace-warn-${thread:threadName}.%d{yyyy-MM-dd}.log">
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level [%logger{50}:%L] %logger{50} - %msg%n"
charset="UTF-8"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
<DefaultRolloverStrategy max="1">
<Delete basePath="logs" maxDepth="2">
<IfFileName glob="*trace-warn.*.log"/>
<IfLastModified age="1d"/>
</Delete>
</DefaultRolloverStrategy>
</RollingRandomAccessFile>
</Route>
</Routes>
</Routing>
<Routing name="FILE-ERROR-${thread:threadName}">
<Routes pattern="$${thread:threadName}">
<Route>
<RollingRandomAccessFile name="FILE-ERROR-${thread:threadName}"
fileName="logs/trace-error-${thread:threadName}.log"
filePattern="logs/trace-error-${thread:threadName}.%d{yyyy-MM-dd}.log">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level [%logger{50}:%L %M] %logger{50} - %msg%n"
charset="UTF-8"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
<DefaultRolloverStrategy max="1">
<Delete basePath="logs" maxDepth="2">
<IfFileName glob="*trace-error.*.log"/>
<IfLastModified age="1d"/>
</Delete>
</DefaultRolloverStrategy>
</RollingRandomAccessFile>
</Route>
</Routes>
</Routing>
<Async name="async" bufferSize="262144" includeLocation="true">
<AppenderRef ref="FILE-INFO-${thread:threadName}"/>
<AppenderRef ref="FILE-DEBUG-${thread:threadName}"/>
<AppenderRef ref="FILE-WARN-${thread:threadName}"/>
<AppenderRef ref="FILE-ERROR-${thread:threadName}"/>
<!-- 只要是级别比INFO高的,包括INFO就输出到控制台 -->
<appender-ref ref="STDOUT" level="INFO"/>
</Async>
</appenders>
<loggers>
<!--Logger用于定义log的level以及所采用的appender,如果无需自定义,可以使用root解决,root标签是log的默认输出形式-->
<!-- 级别顺序(低到高):TRACE < DEBUG < INFO < WARN < ERROR < FATAL -->
<!-- 配置addtivity="true" 默认是true,标识向上级传递日志(INFO是DEBUG的上级)。只有显示指定为false时,才不会向上级输出 -->
<AsyncLogger level="DEBUG" name="com.chy.trace.dao" includeLocation="true" additivity="false">
<appender-ref ref="FILE-DEBUG-${thread:threadName}"/>
</AsyncLogger>
<AsyncRoot level="INFO" includeLocation="true">
<AppenderRef ref="async"/>
</AsyncRoot>
</loggers>
</configuration>