首先引入这几个包
<!-- 通用日志接口 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- jcl -> slf4j的替换器,某些第三方包可能使用的是jcl接口,这个包用于将jcl转到slf4j-->
<!-- <dependency>-->
<!-- <groupId>org.slf4j</groupId>-->
<!-- <artifactId>jcl-over-slf4j</artifactId>-->
<!-- <version>1.7.25</version>-->
<!-- </dependency>-->
<!-- 日志桥接包, 2.11.1对应log4j2的版本 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.11.1</version>
</dependency>
<!-- log4j2的真正实现包,貌似这里不主动引入,log4j-slf4j-impl会自动将这个包引进来-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.1</version>
</dependency>
接着是配置文件log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
status指定全局日志等级(可能会被loggers的root level覆盖)
-->
<Configuration status="warn" name="log4j2ConfigureXML">
<Appenders>
<!--
定义标准输出的日志格式(SYSTEM_OUT)
%d: 表示日期
%level:表示日志级别,%-5level,表示5个占位符
%t: 方法名
%m: 消息体(即我们填的信息)
%C: 包名 (%F: 类文件名,这里没加)
%L: 行号
ThresholdFilter过滤器,这里指定接受的日志级别,低于该级别的日志直接丢弃
-->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d [%-5level][%t] %m (%C:%L) %n"/>
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
</Console>
<!--
指定日志文件
-->
<File name="logfile" fileName="logs/all.log" append="true">
<PatternLayout pattern="%d [%-5level][%t] %m (%C:%L) %n"/>
</File>
<!--
滚动更新,即当日志文件尺寸大于SizeBasedTriggeringPolicy size时,就新建一个filePattern指定命名格式的日志文件
DefaultRolloverStrategy max指定最多新建日志文件的个数
fileName指定的是最新的日志信息文件名
-->
<RollingFile name="rollingFile" fileName="logs/rolling.log"
filePattern="logs/rolling-%d{yyyy-MM-dd HH}--%i.log">
<PatternLayout>
<Pattern>%d [%-5level][%t] %m (%C:%L) %n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
<DefaultRolloverStrategy max="20"/>
</RollingFile>
<!-- 配置Zookeeper的文件日志Appender -->
<File name="zkLogFile" fileName="logs/zk.log" append="true">
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d [%-5level][%t] %m (%C:%L) %n"/>
</File>
</Appenders>
<Loggers>
<!-- 日志文件设置为warn级别 ,控制台打印info级别-->
<logger name="MyLogger" >
<AppenderRef ref="logfile" level="warn"/>
<AppenderRef ref="rollingFile" level="warn"/>
<AppenderRef ref="Console" level="info"/>
</logger>
<logger name="org.apache.zookeeper">
<AppenderRef ref="zkLogFile" level="warn"/>
<AppenderRef ref="Console" level="warn"/>
</logger>
<!--
root level指定Appender的日志等级,root level会影响到上面logger的输出,当上面logger的日志级别低于root level时,
就不会输出了,但是当root level低于上面的logger的日志级别时,将会按照上面的logger的level来输出
AppenderRef ref引用上面定义的日志Appender
总结一下:能影响到输出的有ThresholdFilter level,logger level, root level
最终的输出级别是max{ThresholdFilter level,logger level, root level}
eg:某个Appender的ThresholdFilter level为debug,引用该Appender的logger的level为info,全局的root level为trace,
最终这个logger的输出级别就为三个level中最高的,即info
-->
<root level="debug">
</root>
</Loggers>
</Configuration>
这里是以Zookeeper和自己定义的MyLogger为例
public static Logger logger= LoggerFactory.getLogger("MyLogger");
分别配置控制台输出的级别和记录日志文件的级别,并且区分Zookeeper和MyLogger
此外关于几个level的关系:
root level指定Appender的日志等级,root level会影响到上面logger的输出,当上面logger的日志级别低于root level时,
就不会输出了,但是当root level低于上面的logger的日志级别时,将会按照上面的logger的level来输出
总结一下:能影响到输出的有ThresholdFilter level,logger level, root level
最终的输出级别是max{ThresholdFilter level,logger level, root level}
eg:某个Appender的ThresholdFilter level为debug,引用该Appender的logger的level为info,全局的root level为trace,
最终这个logger的输出级别就为三个level中最高的,即info