关系详解:https://www.cnblogs.com/Sinte-Beuve/p/5758971.html
关系详解:http://phl.iteye.com/blog/2021461
关系详解:https://www.cnblogs.com/chenhongliang/p/5312517.html
log4j.perpoties转换logback.xml:https://logback.qos.ch/translator/
log4j2 +slf4j :https://blog.csdn.net/u014532217/article/details/78238003
System.out.println(“logger impl:”+loging.getClass().getName()); 获取类名,找出冲突包
slf4j —————————————————
| | |
impl(0开销) (适配层)
| | |
logback < log4j < log4j2(性能优并发)
推荐使用 log4j2 + slf4j + 旧版本迁移
一、log4j2单独的配置与使用
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--###################log4j2基础配置#####################-->
<!--status 设置为 TRACE < DEBUG < INFO < WARN < ERROR < FATAL 不会会输出设置值以下的信息-->
<!--monitorInterval 每隔300s读取下配置-->
<!--
<Configuration status="WARN" monitorInterval="300">
<Appenders>
<!–Console 输出到控制台
<Console name="Console" target="SYSTEM_OUT">
配置参数详解
%d{HH:mm:ss.SSS} 表示输出到毫秒的时间
%t 输出当前线程名称
%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%logger 输出logger名称,因为Root Logger没有名称,所以没有输出
%msg 日志文本
%n 换行
其他常用的占位符有:
%F 输出所在的类文件名,如Client.java
%L 输出行号
%M 输出所在方法名
%l 输出语句所在的行数, 包括类名、方法名、文件名、行数
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<File name="MyFile" fileName="D:/logs/app.log">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</File>
</Appenders>
<Loggers>
additivity="false" Logger只会在自己的appender里输出 或者只输出到文件
<Logger name="mylog" level="trace" additivity="true">
<AppenderRef ref="Console" />
<AppenderRef ref="MyFile" />
</Logger>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>–>
-->
<!---->
<!--###################log4j2日志回滚配置#####################-->
<!-- fileName 指定当前日志文件的位置和文件名称
filePattern 指定当发生Rolling时,文件的转移和重命名规则
SizeBasedTriggeringPolicy 指定当文件体积大于size指定的值时,触发Rolling
DefaultRolloverStrategy 指定最多保存的文件个数
-->
<Configuration status="WARN" monitorInterval="300">
<properties>
<property name="LOG_HOME">D:/logs</property>
<property name="FILE_NAME">mylog</property>
</properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
<RollingRandomAccessFile name="MyFile"
fileName="${LOG_HOME}/${FILE_NAME}.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i.log">
<PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
<Policies>
<!--mm 最小时间度,1分钟-->
<TimeBasedTriggeringPolicy interval="1" />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<Logger name="com.template.web" level="trace" additivity="false">
<AppenderRef ref="MyFile" />
</Logger>
<Root level="error">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
<!--###################log4j2日志回滚配置+不同日志级别文件#####################-->
<!--
DENY:返回 DENY,日志将立即被抛弃不再经过其他过滤器
NEUTRAL:有序列表的下个过滤器接着处理日志
ACCEPT:日志会被立即处理,不再经过剩余过滤器
ThresholdFilter
临界值过滤器,过滤掉低于指定临界值的日志。
LevelFilter
级别过滤器,根据日志级别进行过滤。
level:过滤级别
onMatch:配置符合过滤条件的操作
onMismatch:配置不符合过滤条件的操作
EvaluatorFilter
求值过滤器,评估、鉴别日志是否符合指定条件,包含节点:
evaluator:鉴别器,通过子标签 expression 配置求值条件
onMatch:配置符合过滤条件的操作
onMismatch:配置不符合过滤条件的操作
-->
<!--
<Configuration status="WARN" monitorInterval="300">
<properties>
<property name="LOG_HOME">D:/logs</property>
</properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
<RollingRandomAccessFile name="InfoFile"
fileName="${LOG_HOME}/info.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
<Filters>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL" />
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingRandomAccessFile>
<RollingRandomAccessFile name="ErrorFile"
fileName="${LOG_HOME}/error.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
<Filters>
<ThresholdFilter level="fatal" onMatch="DENY" onMismatch="NEUTRAL" />
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingRandomAccessFile>
<RollingRandomAccessFile name="FatalFile"
fileName="${LOG_HOME}/fatal.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/fatal-%d{yyyy-MM-dd}-%i.log">
<Filters>
<ThresholdFilter level="fatal" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="Console" />
<AppenderRef ref="InfoFile" />
<AppenderRef ref="ErrorFile" />
<AppenderRef ref="FatalFile" />
</Root>
</Loggers>
</Configuration>-->
<!--###################log4j2日志回滚配置+异步写日志#####################-->
<!--<Configuration status="WARN" monitorInterval="300">-->
<!--<properties>-->
<!--<property name="LOG_HOME">D:/logs</property>-->
<!--<property name="FILE_NAME">mylog</property>-->
<!--</properties>-->
<!--<Appenders>-->
<!--<Console name="Console" target="SYSTEM_OUT">-->
<!--<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />-->
<!--</Console>-->
<!--<RollingRandomAccessFile name="MyFile"-->
<!--fileName="${LOG_HOME}/${FILE_NAME}.log"-->
<!--filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i.log">-->
<!--<PatternLayout-->
<!--pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />-->
<!--<Policies>-->
<!--<TimeBasedTriggeringPolicy interval="1" />-->
<!--<SizeBasedTriggeringPolicy size="10 MB" />-->
<!--</Policies>-->
<!--<DefaultRolloverStrategy max="20" />-->
<!--</RollingRandomAccessFile>-->
<!--<Async name="Async">-->
<!--<AppenderRef ref="MyFile" />-->
<!--</Async>-->
<!--</Appenders>-->
<!--<Loggers>-->
<!--<!–日志标志–>-->
<!--<Logger name="asynclog" level="info" additivity="false" >-->
<!--<AppenderRef ref="Async" />-->
<!--</Logger>-->
<!--<Root level="error">-->
<!--<AppenderRef ref="Console" />-->
<!--</Root>-->
<!--</Loggers>-->
<!--</Configuration>-->
test
public class Log4j2 {
//private static Logger loging = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
//private static final Logger loging = LogManager.getLogger("mylog");
//private static final Logger loging = LogManager.getLogger("asynclog");
private static final Logger loging = LogManager.getLogger(Log4j2.class);
public static void main(String[] args) {
for (int i = 0; i < 50000; i++) {
loging.trace("trace level");
loging.debug("debug level");
loging.info("info level");
loging.warn("warn level");
loging.error("error level");
loging.fatal("fatal level");
}
try {
Thread.sleep(1000 * 61);
} catch (InterruptedException e) {
}
loging.trace("trace level");
loging.debug("debug level");
loging.info("info level");
loging.warn("warn level");
loging.error("error level");
loging.fatal("fatal level");
}
}
<!--log4j2 https://logging.apache.org/log4j/2.x/maven-artifacts.html#Using_Log4j_in_your_Apache_Maven_build-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j2.version}</version>
</dependency>
二、log4j2+slf4j的结合的配置与使用