今天听网友介绍说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+/了吧哈哈哈

log4j 2.+框架的更多相关文章

  1. Slf4j+Log4j日志框架入门

    (一).日志系统介绍 slf4j,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统.简答的讲就是slf4j是一系列的 ...

  2. Log4j日志框架小记

    人啊,总是在学习中发现不足,不足中学习,学习中成长. 今天来系统记录一下对于常用日志组件的理解.配置.使用. 仅供参考, 错误之处请各路好汉不吝笔墨批评指正. 转载请注明出处 Log4j日志框架是Ap ...

  3. SpringBoot系列之切换log4j日志框架

    SpringBoot系列之使用切换log4j日志框架 ok,在pom文件右键->Diagrams->show Dependencies....,如图,找到spring-boot-start ...

  4. 一、log4j日志框架的理论和不同场景使用

    1.日志框架: 工作中要进行Java输出日志时,你需要一个或者多个日志框架.框架能提供对象.方法和必要的配置来发送日志信息.Java语言本身有自带的日志实现包java.util.logging.还有很 ...

  5. log4j日志框架学习

    初识Log4j:      log4j有三个部分:           1.loggers 负责捕获日志信息.           2.appenders  负责输出信息到不同的目的地         ...

  6. Spring源码学习:第2步--使用SLF4j+Log4j日志框架替换掉其自身的commons-logging日志框架

    正如Spring官方文档所述,其底层的实现选择了commons-logging作为日志框架.这一"失足"性的选择,竟连Spring自身都抱怨.但是,谁叫Spring如此优秀呢,即使 ...

  7. log4j日志框架的使用

    java.util.logging.Logger——java 中提供的日志类 实际开发 90% 都是使用 log4j 记录日志,而 Log4j 底层就是 java.util.logging.Logge ...

  8. log4J日志框架

    log4j的配置:log4j是一个日志输出框架,就是用于输出日志的,主流框架大部分都是Log4j输出.Spring框架也可以通过Log4j输出日志 Log4j提供了强大的日志输出的自定义功能(1)通过 ...

  9. Log4j日志框架学习零到壹(一)

    日志是系统开发过程中用于排查问题重要的记录.通常使用日志来记录系统运行的行为,什么时间点发生了什么 事情.Java中常用的莫过于Log4j框架了.下面主要围绕Log4j的基础知识.Log4j的使用方式 ...

随机推荐

  1. 非阻塞tcp服务器与阻塞的tcp服务器对比

    一般的tcp服务器(阻塞)是使用的如下 [erlang] gen_tcp传输文件原型 http://www.cnblogs.com/bluefrog/archive/2012/09/10/267904 ...

  2. Js 框架之Vue .JS学习记录 ① 与Vue 初识

    目录 与 Vue.js 认识 VUE.JS是个啥?有啥好处? Vue 的目标 战前准备  VUE.JS环境 VUE.JS 尝试一下,你就明白 第一步 实例化VUE 对象 第二步VueAPP 调用数据 ...

  3. 美团2017年CodeM大赛-初赛B轮-黑白树

    https://ac.nowcoder.com/acm/problem/13249 链接:https://ac.nowcoder.com/acm/problem/13249来源:牛客网 题目描述 一棵 ...

  4. vue-详情列表偷懒遍历

    假如数据格式是这样的: 文案的字段名和数据的字段名完全对应,我们在处理数据的时候,就可以用: 完美:

  5. 关于noip2017的感想

    关于noip2017的感想 晚自习没有事做,也不知道该干什么. 第一次参加noip提高组. 前2年参加普及还算不错,没有犯任何错误. 去年就做了几套历年真题,感觉500+很好拿呀. 但去年的时候看20 ...

  6. 你所误解的微信公众号开发、以及微信公众号网页授权、接收url跳转参数等问题

    前言:有一星期没跟新博客了,最近太忙.项目赶进度就没把时间花在博客上:今天来说说所谓的微信公众号开发和填坑记录: 微信公众号:运行在微信终端的应用 (对于开发者来说比较爽的你只需考虑兼容微信浏览器,因 ...

  7. python 变量之小整数池跟大整数池

    在python中定义变量会有:id,type,value.对于==比较的是value,对于is比较的是id. 因此,对于相同value的变量,它的type相同,但是它的id值可能不一样.对于相同id的 ...

  8. 压测过程中出现ops断崖式下跌原因及排解

    压测机器: 100台docker redis集群:16个分片 在开始压测的半个小时中,一直很稳定,ops稳定在20w左右.但是接下来突然ops断崖式下跌,ops降到了3w以下.然后持续一段时间,直至变 ...

  9. C# MethodInvoker委托的使用

    一.MethodInvoker是什么? MethodInvoker 表示一个委托,该委托可以执行托管代码中声明为void且不接受任何参数的任何方法.在对控件的 invoke 方法进行调用时或需要一个简 ...

  10. python之路-----前端之http协议

    一.概述 HTTP(hypertext transport protocol),即超文本传输协议.这个协议详细规定了浏览器和万维网服务器之间互相通信的规则(B/S架构). HTTP就是一个基于TCP的 ...