End of Life On August 5, 2015 the Logging Services Project Management
Committee announced that Log4j 1.x had reached end of life. For
complete text of the announcement please see the Apache Blog. Users of
Log4j 1 are recommended to upgrade to Apache Log4j 2.
是的,log4j停止于1.x版本,迎来了log4j 2,也就是我们今天要说的log4j 2.
Log4j 1.x 在高并发情况下出现死锁导致cpu使用率异常飙升
Log4j2.0基于LMAX Disruptor的异步日志在多线程环境下性能会远远优于Log4j 1.x和logback(官方数据是10倍以上)
使用slf4j门面模式调用:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LogManager.getLogger(TestLog4j2Application.class);
logger.info(...);
logger.warn(...);
logger.error(...);
项目原来是使用log4j + slf4j 使用的,打印日志都是使用slf4j这个门面模式。改造起来比较轻松,不需要改动代码。
看了许多论坛的文章,自己整理了一份,比较适合项目的配置。
web项目,pom.xml配置:
<!-- log4j2 结合 slf4j Start -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.9.1</version>
</dependency>
<!-- Web项目需添加 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.9.1</version>
</dependency>
<!--用于与slf4j保持桥接-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.9.1</version>
</dependency>
<!-- slf4j核心包-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- log4j2 结合 slf4j End -->
resources 下 log4j2.xml 配置
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j2 能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<Configuration status="info" monitorInterval="300">
<Properties>
<!-- log输出位置 -->
<Property name="log_base_dir">${sys:catalina.home}/logs/aglog</Property>
<!-- log输出格式 -->
<Property name="log_pattern">%d{yyyy-MM-dd HH:mm:ss:SSS} [%t] %p %C:%L - %m%n</Property>
<!-- 单个日志文件大小 50MB-->
<Property name="log_size">50MB</Property>
<!-- 设置同一类型日志,(每天的文件数量上限 20),默认为7个-->
<Property name="log_file_max">20</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<!-- 控制台只记录debug及以上级别日志,其他拒绝 -->
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${log_pattern}"/>
</Console>
<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面,每天的日志压缩存档-->
<!-- 普通必要的日志 -->
<RollingFile name="InfoLog" fileName="${log_base_dir}/info.log"
filePattern="${log_base_dir}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz">
<!-- 只记录info级别日志,其他拒绝 -->
<Filters>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="${log_pattern}"/>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
<SizeBasedTriggeringPolicy size="${log_size}"/>
</Policies>
<DefaultRolloverStrategy max="${log_file_max}"/>
</RollingFile>
<!-- 警告日志 -->
<RollingFile name="WarnLog" fileName="${log_base_dir}/warn.log"
filePattern="${log_base_dir}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz">
<!-- 只记录warn级别日志,其他拒绝 -->
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="${log_pattern}"/>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
<SizeBasedTriggeringPolicy size="${log_size}"/>
</Policies>
<DefaultRolloverStrategy max="${log_file_max}"/>
</RollingFile>
<!-- 错误日志 -->
<RollingFile name="ErrorLog" fileName="${log_base_dir}/error.log"
filePattern="${log_base_dir}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz">
<!-- 只记录error及以上级别日志,其他拒绝 -->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${log_pattern}"/>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
<SizeBasedTriggeringPolicy size="${log_size}"/>
</Policies>
<DefaultRolloverStrategy max="${log_file_max}"/>
</RollingFile>
</Appenders>
<Loggers>
<!--过滤掉spring、hibernate 等,一些无用的DEBUG信息-->
<logger name="org.springframework" level="INFO"></logger>
<logger name="org.hibernate" level="INFO"></logger>
<Root level="DEBUG">
<!-- 打生产包前,建议将Console注释掉 -->
<appender-ref ref="Console"/>
<appender-ref ref="InfoLog"/>
<appender-ref ref="WarnLog"/>
<appender-ref ref="ErrorLog"/>
</Root>
</Loggers>
</Configuration>
关于压缩文件格式log4j2对 gz的格式,比zip的 支持要好:
有趣的现象,我测试时使用的文件size上限10KB,数量最多10个。
当超出数量,覆盖时。zip的名称与内部log名称不同,好几个文件解压后名称都是一样的。而gz不会有这种情况。
gz的压缩后占用更小: