Log4j2使用总结

Log4j 2 包含了基于LMAX 分离库的下一代的异步日志系统,在多线程环境下,异步日志系统比 Log4j 1.x 和Logback 提高了10倍性能提升(吞吐量和延迟率 )。原文如下:

Log4j 2 contains next-generation Asynchronous Loggers based on the LMAX Disruptor library. In multi-threaded scenarios Asynchronous Loggers have 10 times higher throughput and orders of magnitude lower latency than Log4j 1.x and Logback.

Log4j2目前已经出到了beta8版本,估计beta9在最近一周将放出,试用了下,感觉还不错,做如下总结!

我是从logback迁移到log4j2,

删除掉原有的包 log4j-over-slf4j-1.6.4.jar logback-classic-1.0.7.jar logback-core-1.0.7.jar slf4j-api-1.6.4.jar

增添以下的包 log4j-over-slf4j-1.7.5.jar log4j-api-2.0-beta8.jar log4j-core-2.0-beta8.jar  log4j-slf4j-impl-2.0-beta8.jar

由于作者推荐,为了性能考虑,尽量不要使用slf4j,但我依赖的第三方框架比如spring有对slf4j使用,所以对JAR包做了以上的取舍,所以原有代码中要做如下的改动

改动前:import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;

     private static final Logger logger = LoggerFactory.getLogger(OOXX.class);

改动后:iimport org.apache.logging.log4j.LogManager;
      import org.apache.logging.log4j.Logger;

     private static final Logger logger = LogManager.getLogger(OOXX.class);

配置文件log4j2.xml如下:

<?xml version="1.0" encoding="UTF-8"?>  
<!-- status=debug 可以查看log4j的装配过程 -->  
<configuration status="off" monitorInterval="1800">  
    <properties>  
        <property name="LOG_HOME">/log/fish</property>  
        <!-- 日志备份目录 -->  
        <property name="BACKUP_HOME">{LOG_HOME}/backup</property>  
        <property name="STAT_NAME">stat</property>  
        <property name="SERVER_NAME">global</property>  
    </properties>  
    <appenders>  
        <!-- 定义控制台输出 -->  
        <Console name="Console" target="SYSTEM_OUT" follow="true">  
            <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />  
        </Console>  
        <!-- 程序员调试日志 -->  
        <RollingRandomAccessFile name="DevLog" fileName="${LOG_HOME}/${SERVER_NAME}"  
            filePattern="${LOG_HOME}/${SERVER_NAME}.%d{yyyy-MM-dd-HH}.log">  
            <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />  
            <Policies>  
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />  
            </Policies>  
        </RollingRandomAccessFile>  
        <!-- 游戏产品数据分析日志 -->  
        <RollingRandomAccessFile name="ProductLog"  
            fileName="${LOG_HOME}/${SERVER_NAME}_${STAT_NAME}"  
            filePattern="${LOG_HOME}/${SERVER_NAME}_${STAT_NAME}.%d{yyyy-MM-dd-HH}.log">  
            <PatternLayout  
                pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />  
            <Policies>  
                <TimeBasedTriggeringPolicy interval="1"  
                    modulate="true" />  
            </Policies>  
        </RollingRandomAccessFile>  
    </appenders>  
    <loggers>  
        <!-- 3rdparty Loggers -->  
        <logger name="org.springframework.core" level="info">  
        </logger>  
        <logger name="org.springframework.beans" level="info">  
        </logger>  
        <logger name="org.springframework.context" level="info">  
        </logger>  
        <logger name="org.springframework.web" level="info">  
        </logger>  
        <logger name="org.jboss.netty" level="warn">  
        </logger>  
        <logger name="org.apache.http" level="warn">  
        </logger>  
        <logger name="com.mchange.v2" level="warn">  
        </logger>  
        <!-- Game Stat  logger -->  
        <logger name="com.u9.global.service.log" level="info"  
            additivity="false">  
            <appender-ref ref="ProductLog" />  
        </logger>  
        <!-- Root Logger -->  
        <root level="DEBUG">  
            <appender-ref ref="DevLog" />  
            <appender-ref ref="Console" />  
        </root>  
    </loggers>  
</configuration>

TimeBased Triggering Policy

基于时间的触发策略。该策略主要是完成周期性的log文件封存工作。有两个参数:

interval,integer型,指定两次封存动作之间的时间间隔。单位:以日志的命名精度来确定单位,比如yyyy-MM-dd-HH 单位为小时,yyyy-MM-dd-HH-mm 单位为分钟

modulate,boolean型,说明是否对封存时间进行调制。若modulate=true,则封存时间将以0点为边界进行偏移计算。比如,modulate=true,interval=4hours,那么假设上次封存日志的时间为03:00,则下次封存日志的时间为04:00,之后的封存时间依次为08:00,12:00,16:00,。。。

存在问题:在Eclipse下一切运行正常,如果把应用打包成jar包发布后,cmd命令行模式下,即使Console开着的情况下,也没法输出,文件输出也没有任何日志。

问题已经解决,需要在MANIFEST.MF文件里Class-Path 最前加个‘.‘,目的是让与jar包平级的配置文件log4j2.xml加载进来。

比如

Class-Path: . lib/antlr-2.7.6.jar lib/other.jar

这样,就把包含了log4j2.xml的路径放到了classpath,因此,log4j2能读取这个文件。感谢老外Jacob Kjome的回复!

log4j2 在Web的应用,把log4j2.xml放在src根目录下,不需要任何在代码级别的设置,直接类似JAVA应用一样使用,但把servlet改成了servlet3.0,因为官网上描述如下:

The Short Story  
Log4j 2 "just works" in Servlet 3.0 and newer web applications. It is capable of automatically starting when the application deploys and shutting down when the application undeploys.Important Note! For performance reasons, containers often ignore certain JARs known not to contain TLDs or ServletContainerInitializers and do not scan them for web-fragments and initializers. Importantly, Tomcat 7 <7.0.43 ignores all JAR files named log4j*.jar, which prevents this feature from working. This has been fixed in Tomcat 7.0.43, Tomcat 8, and later. In Tomcat 7 <7.0.43 you will need to change catalina.properties and remove "log4j*.jar" from the jarsToSkip property. You may need to do something similar on other containers if they skip scanning Log4j JAR files.

但发现在eclipse下servlet2.0 也可以用的,并且不用修改catalina.properties文件。我用的是apache-tomcat-7.0.42,很奇怪!

有时候,为了同一份log4j文件要支持写到不同的log中(否则会导致打印的内容被覆盖,其中一个进程写不进log等问题),需要在载入的时候对内容进行动态修改,比如根据server id分别生成game1.log,game2.log

可以代码进行加载log4文件

File file = new File("log4j2.xml");  
        BufferedInputStream in = null;  
        try {  
            in = new BufferedInputStream(new FileInputStream(file));
 final ConfigurationSource source = new ConfigurationSource();  
            source.setInputStream(in);  
            Configurator.initialize(null, source);  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        }

要使用异步写日志的功能,必须引入Disruptor

<asyncRoot> or <asyncLogger>

官方建议一般程序员查看的日志改成异步方式,一些运营日志改成同步

Asynchronous Appenders 和 Asynchronous Loggers 区别:

在</appenders> 节点里添加

<Async name="Async">
      <AppenderRef ref="MyFile"/>
    </Async>

为Asynchronous Appenders 性能比同步快,比Asynchronous Loggers慢

在loggers节点添加

<AsyncLogger name="com.foo.Bar" level="trace" includeLocation="true">
      <AppenderRef ref="RandomAccessFile"/>
    </AsyncLogger>

或者添加

<!-- Root Logger -->
<asyncRoot level="DEBUG">
<appender-ref ref="DevLog" />
<appender-ref ref="Console" />
</asyncRoot>

为logger async 用的是无锁并发技术,必须引入Disruptor

测试了下,单线程异步比同步效率提高了1倍。线程越多性能提高越明显。

如果要加上位置信息比如哪个类,第几行,需要设置 includeLocation="true" 但默认不设置好像也是true,

location 主要包含了如下:

If one of the layouts is configured with a location-related attribute like HTML locationInfo, or one of the patterns %C or $class%F or %file%l or %location%L or %line%M or %method, Log4j will take a snapshot of the stack, and walk the stack trace to find the location information.

时间: 2024-10-11 22:12:48

Log4j2使用总结的相关文章

log4j与log4j2

一 log4j log4j是Apache的一个开源项目,用于输出程序的运行状况. 相比于在程序内部添加System.out.println()做日志输出,log4j有如下优点: 可以设定信息输出的目的地,常用的有控制台.文件等. 根据日志的严重程度,将日志分为6级,从高到低依次是:fatal.error.warn.info.debug.trace. 可以设定日志的输出格式,包含动态的信息. 可以开启或者关闭信息输出. 在java代码获取日志对象并输出: Logger logger=Logger.

log4j2日志配置

背景 log4j2相对于log4j 1.x有了脱胎换骨的变化,其官网宣称的优势有多线程下10几倍于log4j 1.x和logback的高吞吐量.可配置的审计型日志.基于插件架构的各种灵活配置等. 1.所需jar 1)maven配置 <dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId&

笔记:MyBatis 日志显示-log4j2

在ClassPath路径创建log4j2.xml配置文件,增加如下日志配置: <?xml version="1.0" encoding="UTF-8"?> <Configuration status="OFF"> ????<!-- 附着器配置,日志输出到什么位置 --> ????<Appenders> ????????<!-- 控制台附着器类型,输出结果到 System.out 或是 Syst

log4j+slf4j迁移到log4j2+slf4j (Servlet3.0)

最近对系统中的旧项目实现log升级,选择了log4j2来代替log4j,作为最新一代的log实现,log4j2好在那里可以直接看log4j2性能章节. 这里写写如何从log4j升级到log4j2. 1. maven依赖的变化,对log4j的依赖变成了对log4j2的依赖,在实际使用过程中发现过旧的jboss logging会有问题,使用了3.3.0.Final支持log4j2的版本. <dependency> <groupId>org.apache.logging.log4j<

使用log4j2打印Log,log4j不能打印日志信息,log4j2不能打印日志信息,log4j和logj2,idea控制台信息乱码(文末)

说来惭愧,今天就写了个"hello world",了解了一下log4j的日志. 本来是想在控制台打印个log信息,也是遇到坎坷重重,开始也没去了解log4j就来使用,log4j配置文件开始用的log4j.properties,结果控制台一直打印ERROR StatusLogger No log4j2 configuration file found.也就是Log4j2配置文件没找到的意思. 我就把log4j.properties文件名改成log4j2.properties,结果不报错了

使用Slf4j集成Log4j2构建项目日志系统的完美解决方案

一.背景 最近因为公司项目性能需要,我们考虑把以前基于的log4j的日志系统重构成基于Slf4j和log4j2的日志系统,因为,使用slf4j可以很好的保证我们的日志系统具有良好的兼容性,兼容当前常见几种日志系统,而使用log4j2而不是log4j是因为Log4j 1.x 在高并发情况下出现死锁导致cpu使用率异常飙升,而Log4j2.0基于LMAX Disruptor的异步日志在多线程环境下性能会远远优于Log4j 1.x和logback(官方数据是10倍以上). 关于slf4j的原理以及优点

log4j报错ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.

ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console. log4j版本:log4j-core-2.7.jar   log4j-api-2.7.jar log4j2只支持xml和json两种格式的配置,所以配置log4j.properties时,是没有作用的. log4j 2.0与以往的1.x有一个明显的不同,其配置

log4j2和kafka集成

log4j2依赖 <dependency>        <groupId>org.apache.logging.log4j</groupId>        <artifactId>log4j-web</artifactId>        <version>2.4</version>        <scope>runtime</scope>    </dependency> kaf

log4j2简介

前言 在介绍log4j2之前先简单介绍一下Log4j.Logback.SFL4J.JUL.JCL这些东西是什么以及有啥作用. Log4j是什么地球人应该都知道.log4j是Log for Java的简称,是Apache的一个开源子项目,有7种不同的日志级别,从低到高一次为TRACE<DEBUG<INFO<WARN<ERROR<FATAL<OFF,支持properties和xml两种配置文件,包含Logger.appender.Layout三个主要组件. SFL4J是Si

详解log4j2(上) - 从基础到实战

log4j2相对于log4j 1.x有了脱胎换骨的变化,其官网宣称的优势有多线程下10几倍于log4j 1.x和logback的高吞吐量.可配置的审计型日志.基于插件架构的各种灵活配置等.如果已经掌握log4j 1.x,使用log4j2还是非常简单的. 先看一个示例 1 基础配置 普通Java项目手动添加jar包 [html] view plain copy print? log4j-api-2.5.jar log4j-core-2.5.jar Maven项目pom.xml [html] vie