log4j2在多线程下的性能比大部分其他的日志框架要高些,同时支持灵活的配置多个日志输出目标。
下面先看log4j2的maven依赖:
<properties>
<log4j.version>2.8.2</log4j.version>
<slf4j.version>1.7.21</slf4j.version>
</properties>
<dependencies>
<!-- log配置:Log4j2 + Slf4j -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-web -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency> <!-- 桥接:告诉Slf4j使用Log4j2 -->
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency> <!-- 桥接:告诉commons logging使用Log4j2 -->
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
</dependencies>
引入log4j的依赖及slf4j的依赖。
下面看使用log4j2的配置文件,配置文件可以是xml,json,properties等形式,我们这里选用的是xml形式。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" monitorInterval="1800" schema="Log4J-V2.2.xsd">
<Properties>
<property name="log_pattern">
%d{yyyy-MM-dd HH:mm:ss} [%t] [%c{1}.%M()] %-5level - %msg%xEx%n
</property>
<property name="log_path">
C:\Users\jjb-hz\Desktop\project\logs
</property>
<property name="file_name">
project.log
</property>
<property name="rolling_file_name">
C:\Users\jjb-hz\Desktop\project\logs\project-%d{yyyy-MM-dd}-%i.log.gz
</property>
<property name="error_file_name">
project_error.log
</property>
<property name="error_rolling_file_name">
C:\Users\jjb-hz\Desktop\project\logs\project_error-%d{yyyy-MM-dd}-%i.log.gz
</property>
<property name="every_file_size">10MB</property><!-- 日志切割的最小单位 -->
<property name="output_log_level">debug</property><!-- 日志输出级别 -->
</Properties>
<Appenders>
<!--这个输出控制台的配置-->
<Console name="Console" target="SYSTEM_OUT">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${log_pattern}" />
</Console>
<!--这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<!-- 按月生成归档日志,可以使用 filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz" -->
<!-- 显示error级别之外的信息 -->
<RollingFile name="RollingFile" fileName="${log_path}/${file_name}" filePattern="${rolling_file_name}" immediateFlush="false">
<PatternLayout pattern="${log_pattern}" />
<SizeBasedTriggeringPolicy size="${every_file_size}"/>
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingFile>
<!--如果需要配置多个Rollingfile地址,还需要在root下添加appender-ref ref="RollingFile1"/>
只显示error级别的信息
-->
<RollingFile name="RollingErrorFile" fileName="${log_path}/${error_file_name}"
filePattern="${error_rolling_file_name}">
<PatternLayout pattern="${log_pattern}"/>
<SizeBasedTriggeringPolicy size="${every_file_size}"/>
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingFile>
</Appenders>
<Loggers>
<!-- 3rdparty Loggers -->
<!-- <logger name="org.springframework.core" level="info">
</logger>
<logger name="org.springframework.beans" level="info">
</logger>
-->
<!--建立一个默认的root的logger,需要在root的level中指定输出的级别,-->
<root level="${output_log_level}">
<appender-ref ref="RollingFile"/>
<appender-ref ref="RollingErrorFile"/>
<appender-ref ref="Console"/>
</root>
</Loggers>
</Configuration>
配置文件的名称最好定义为log4j2+文件后缀,比如log4j2.xml,log4j2.json,log4j2.properties等
log4j2的配置形式很多很强大,这里仅仅是我自己平时使用的一点点配置而已,如果觉得不够可以自行百度寻找,或者看官方文档。
如果项目环境是基于Servlet3.0版本以上,且配置文件的前缀为“log4j2”,配置文件在项目跟路径下,那么log4j2就可以使用了,不需要其他的配置。因为我们再添加了log4j2的依赖后,引入了一个“Log4jServletContainerInitializer”的类,此类继承自ServletContainerInitializer,tomcat容器在启动时会扫描所有的ServletContainerInitializer的子类,调用其onStartup方法。也就是说Log4jServletContainerInitializer会在项目启动时会执行onStartup方法,在此方法内加载配置文件,同时初始化log4j2。感兴趣的可以查看此方法,能对log4j2的配置文件加载,配置文件形式,初始化的执行等等方面有更深刻的了解。