log4j2实战和共享

log4j2  日志使用和共享

@author 鲁伟林
工作量:
1. log4j2 是一个高性能日志系统。Java日志系统,首选log4j2。
2. 网上关于log4j2配置信息非常多,但鱼龙混杂,在加上某度的搜索功能,不敢恭维。许多博客,就是把英文版log4j2翻译一通,自己都不一定能跑起来。
3. 本文共享我工作中使用的log4j2配置,帮助各位满足项目中日志输出
4. log4j2配置提供了异步和同步日志输出
5. 日志输出分不同的级别,分别输出到不同的文件中
6. 日志文件利用日志文件个数和日志文件大小控制,防止日志过多消耗机器磁盘空间7. Error的日志输出也会输出到info的文件
可参考的gitHub项目地址:https://github.com/thinkingfioa/netty-learning/tree/master/netty-private-protocol
欢迎各位Follow

踩过的坑 - (阅读本博客解决)

  • 1.配置的日志输出格式(log_pattern),无效
  • 2.日志不往日志文件中输出。日志文件的大小size一直为0
  • 3.不会将日志分级别输出到不同的文件中
  • 4.日志严格控制日志文件个数和日志文件的大小,防止磁盘满了
  • 5.使用log4j2日志异步输出模式,提高日志输出性能

1. 共享log4j2配置

给大家共享下我的log4j2的配置

代码:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
    <properties>
        <!--  -->
        <property name="log_pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %l - %msg%n</property>
        <property name="log_home">~/logs/netty-learning</property>
        <property name="file_name">netty-private-protocol</property>
        <property name="every_file_size">20M</property>
        <property name="output_log_level">debug</property>
        <property name="file_count">20</property>
        <property name="error_file_count">3</property>
    </properties>

    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${log_pattern}"/>
        </Console>
        <!-- RollingFile -->
        <RollingFile name="RollingFile" fileName="${log_home}/${file_name}.log" filePattern="${log_home}/${file_name}-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout pattern="${log_pattern}"/>
            <SizeBasedTriggeringPolicy size="${every_file_size}"/>
            <DefaultRolloverStrategy max="${file_count}"/>
            <Filters>
                <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="NEUTRAL"/>                <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="NEUTRAL"/>                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="trace" onMatch="DENY" onMismatch="DENY"/>
            </Filters>
        </RollingFile>
        <!-- RollingRandomAccessFile -->
        <RollingFile name="RollingFile1" fileName="${log_home}/${file_name}-error.log" filePattern="${log_home}/${file_name}-error-%d{yyyy-MM-dd}-%i.log">
            <SizeBasedTriggeringPolicy size="${every_file_size}"/>
            <DefaultRolloverStrategy max="${error_file_count}"/>
            <Filters>
                <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="NEUTRAL"/>                <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="${log_pattern}"/>
        </RollingFile>
    </Appenders>

    <Loggers>

         <!--  此处的name="org.lwl"必须要改,否则日志无法输出到文件中。定义的格式也不对 -->
         <!-- 请将name="org.lwl"改成: name="你的项目包前缀" -->
        <!-- log4j2 asyn more fast-->
        <AsyncLogger name="org.lwl" level ="${output_log_level}" additivity="false" includeLocation="true">
            <appender-ref ref="RollingFile"/>
            <appender-ref ref="RollingFile1"/>
            <appender-ref ref="Console"/>
        </AsyncLogger>

        <!-- log4j2 Synchronous --> -->
        <!-- <root level="${output_log_level}">
            <appender-ref ref="RollingFile"/>
            <appender-ref ref="RollingFile1"/>
            <appender-ref ref="Console"/>
        </root> -->
    </Loggers>
</Configuration>

1.1 我的log4j2配置解释

  • 1.标签<properites>中配置了一些基本属性。提醒各位"logpattern"值得是日志输出格式,建议使用和我一样的"logpattern"。当需要排查问题,查看日志时会感谢我的。
  • 2.我的log4j2配置,是会分日志级别输出到不同的文件。日志级别为:info和debug输出到文件为:${filename}.log文件中。日志级别为:error输出到${filename}-error.log
  • 3.日志文件存放在目录: ~/logs/netty-learning
  • 4.log4j2提供同步日志输出和异步日志输出,我的log4j2配置在结尾部分,都分别给出。
  • 5.经过测试,可以发现: AsyncLogger(异步)的确比root(同步)快很多

1.2 使用我的log4j2配置需要改动点

如果使用我的log4j2配置,基本需要改的都在标签<properties>中,相信大家一看就懂。

1.3 一定要改的点,特别提醒,大坑

  • 1.lgo4j2有一个非常恶心的地方,我花费了很长时间才发现。我的配置中,在配置文件结尾,属性<AsyncLogger>中的: name="org.lwl",请务必改成:name="你项目包前缀"。
  • 2.否则,日志将写不进文件中,日志文件大小一直为0。且定义的${log_patter}也无效

1.3 Demo

具体项目参考地址: log4j2

代码:
package org.lwl.netty;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class NettyClient {
    private static final Logger LOGGER = LogManager.getLogger(NettyClient.class);

    public static void main(String [] args) {
        LOGGER.info("Hello {}", "log4j2");
   }
}

2. log4j2日志同步输出

如果使用log4j2同步输出,请打开配置中下面这段代码:

代码:
<!-- log4j2 Synchronous --> -->
<!-- <root level="${output_log_level}">
    <appender-ref ref="RollingFile"/>
    <appender-ref ref="RollingFile1"/>
    <appender-ref ref="Console"/>
</root> -->
Maven依赖:
<!-- log4j2 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.10.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.10.0</version>
</dependency>
<!-- log4j2 end. -->

3. log4j2日止异步输出

如果使用lo4j2异步输出,请使用下列代码:

代码:
<!-- log4j2 asyn more fast-->
<AsyncLogger name="org.lwl" level ="${output_log_level}" additivity="false" includeLocation="true">
    <appender-ref ref="RollingFile"/>
    <appender-ref ref="RollingFile1"/>
    <appender-ref ref="Console"/>
</AsyncLogger>
Maven依赖

log4j2的异步输出,使用了无锁队列: disruptor。所以maven需要添加其依赖。

<!-- log4j2 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.10.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.10.0</version>
</dependency>
<dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
    <version>3.3.7</version>
</dependency>
<!-- log4j2 end. -->
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值