log4j2 + slf4j 项目实践

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的压缩后占用更小:

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值