今天听网友介绍说Log4j2说效率比lOG4J高而且敲级好用。晚上有空就花了几个时间研究了一下。发现嗯,的确好用。我还清楚的记得Log4j1.2的时候我们需要设置log4j需要通过一个properties文件去对它的输出方法和partten进行设置。今天对比了一下log4j2的设置其实两者大同小异。接下来就一起来看一下最简单的入门方法吧
首先使用框架必须导包。
log4j2只需通过这两个包就能够完成基本的log实现。这个1.2版本也是一样的。接下来就是1.2和2.+版本的差别了。2.+版本log4j使用了xml进行配置,当然也支持很多其他格式的配置文件配置,这里我是学java的其他.json什么的都用不习惯就不说了。有兴趣的话可以去看一下官方文档,上面有说明。或者也有其他国外的大神也有博客。
接着使用xml第一时间就应该联想到xsd/dtd。这里然没错在源码包一搜就找到了3个xsd
接下来我们新建一个java项目。写一个Test类。
这是测试类的代码。我用了Junit测试单元来进行测试下面粘贴一下代码。Junit版本4和5用法一样
package cn.devil.test; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.jupiter.api.Test; public class Log4jTester { @Test public void testLog() { Logger logger = LogManager.getLogger(Log4jTester.class); logger.debug("调试日志"); logger.info("信息日志"); logger.warn("警告日志"); logger.error("错误日志"); logger.fatal("致命错误日志"); } }
这里方法的调用和之前的log4j1.2版本的一模一样。(可能官方也想过降低我们菜鸟的学习成本)
接着到最重要的部分了XML!的配置!!!!!
我们新建一个source文件夹添加刚才找到的config.xsd进去,schema Location 写 Log4J-V2.3.xsd
补充一下:作者这个规则文件写的很糟糕很多地方是没有提示的。包括很多标签都不给提示。对比起Spring的xml配置来说简直就像一堆翔。
接下来就按照这个规则文件创建xml
这样XML的规则配置就算是成功了。然而我们的配置才是刚刚开始。这里加入一个。我仔细查看源码的时候发现log4j2支持原来的properties文件的配置。明明规范如下
在classpath:下面创建log4j2.component.properties文件
具体位置在org.apache.logging.log4j.util.PropertiesUtil这个类里面可以查看。这里只是提出一下。现在由于使用了新版本的jar包所以作者说在新的版本不需要再设置Log4jContextSelector
所以现在还不需要这个配置文件。
我们只需要把原来的root标签改为<asyncRoot>就可以实现了。而且这个标签可以局部设置async,这就意味着我们可以仅仅一部分的日志采用这种方式去记录。
接下来是贴一下XML文件的配置并且对配置信息做一下说明
<?xml version="1.0" encoding="UTF-8"?> <Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Log4J-V2.3.xsd" status="DEBUG"> <Appenders> <Console name="Console"> <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36}:%L %M - %msg%n"/> </Console> <RandomAccessFile name="RandomAccessFile" fileName="D:/log/async.log" immediateFlush="false" append="true"> <PatternLayout> <Pattern>%d %p %c{1.} [%r] %m %ex%n</Pattern> </PatternLayout> </RandomAccessFile> </Appenders> <Loggers> <Root level="DEBUG" includeLocation="true"> <AppenderRef ref="Console"/> </Root> <asyncRoot level="DEBUG"> <AppenderRef ref="RandomAccessFile"/> </asyncRoot> </Loggers> </Configuration>
Appenders这里需要使用异步文件写入需要RandomAccessFile标签fileName是文件的绝对路径。immediateFlush这个immediateFlush必须设置成false这样系统才会启动缓冲池。如果马上刷新着个异步写入就没有意义了。
append="true"这个是日志文件不断地向后面追加日志如果设置成false新的日志会覆盖前面的日志这个配置默认是true。然后到了root标签这里需要改成asyncRoot标签level代表日志等级这里log4j2.+版本新增了trace等级这个等级比Debug模式
更低一般开发都不会用到···= =大佬们10个之中8个都这么说···
以上就配置完成了。于是写了一个测试类去试一下效率
package cn.devil.test; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.jupiter.api.Test; public class Log4jTester { @Test public void testLog() { Logger logger = LogManager.getLogger(Log4jTester.class); for(int i = 0; i< 2500000;i++) { logger.debug("testLog1"); } } }
这边我修改了一下日志输出的partten输出结果如下
写这么多条log用了3619ms
接下来测试原来的logback方式生成logger看一下需要多长时间
附上log4j1.2的properties文件里面的配置信息
log4j.rootLogger=DEBUG,A2 log4j.appender.A2=org.apache.log4j.FileAppender log4j.appender.A2.file=d:/log/lo4j.log log4j.appender.A2.layout=org.apache.log4j.PatternLayout log4j.appender.A2.layout.ConversionPattern=%d %p %-4c [%-8r] %m %m%n
log4j2框架下这个数据量就增加了这么多倍的写入速度。如果数据再翻几倍两者之间的差距就更明显了。个人业余时间不多。暂时只能对这个2.0框架有个初步的使用了解,
如果有时间的话一定会更深入的了解这个环状的数据结构。官方称它是个数组但是在操作的时候没有多余地使用它的下标淘汰的数据由JNI回收机制回收。ennn什么云云的
看上去结构也很复杂。先上个图。如果看到这篇博文的朋友感兴趣的话可以去看一下
https://logging.apache.org/log4j/2.x/manual/async.html
而且官方文档现在写的是相当的完善。对于入门来说也非常友好。规则文件写的稀烂是个缺点。ennn可能我还是太过于依赖alt+/了吧哈哈哈