Log4j2 简介
介绍
Log4j2是Log4j的升级版,与之前的版本Log4j 1.x相比、有重大的改进,修正了Logback固有的架构问题的同事,改进了许多Logback所具有的功能。
特性
一、API 分离
Log4j2将API与实现分离开来。开发人员现在可以很清楚的知道能够使用哪些没有兼容问题的类和方法,同事又允许通过自己实现来增加功能。
二、改进性能
Log4j2的性能在某些关键领域比Log4j 1.x更快,而且大多数情况下与Logback相当。
三、支持多种 API
Log4j 2提供了最棒的性能的同事,还支持SLF4J和公共日志记录API。
四、自动装配加载
五、高级过滤功能
与Logback类似,Log4Jj2可以支持基于上下文数据、标记、正则表达式以及日志时间中的其他组件的过滤。Log4j2能够专门制定适用于所有的事件,无论这些事件在传入Loggers之前还是正在传给appenders。另外,过滤器还可以与Loggers关联其阿里。与Logback不同的是,Filter公共类可以用于任何情况。
六、插件架构
所有可以配置的组件都以Log4j插件的形式来定义。同样地,不需要修改任何Log4j代码就可以创建新的Appender、layout、Pattern Convert等等。Log4j自动识别预定义的插件,如果在配置中引用到这些插件,Log4j就会自动载入使用。
七、属性支持
属性可以在配置文件中引用,也可以直接替代或传入潜在的组件,属性在这些组件中能够动态解析。属性可以是配置文件、属性文件、环境变量、线程上下文映射以及事件中的数据中定义的值。用户可以通过增加自己的Lookup插件来定制自己的属性。
改进
一、更为先进的API (Modern API)在此之前,程序员们如下方式进行日志记录:
if(logger.isDebugEnabled()) {
logger.debug("Hi, " + u.getA() + “ “ + u.getB());
}
许多人都会抱怨上述代码的可读性太差了。如果有人忘记写if语句,程序输出中会多出很多不必要的字符串。现在Java虚拟机(JVM)也许对字符串的打印和输出进行了很多优化,但是难道我们仅仅依靠JVM优化来解决上述问题?
log4j2 开发团队鉴于以上考虑对API进行了完善。
现在你可以这样写代码:
logger.debug("Hi, {} {}", u.getA(), u.getB());
和其他一些流行的日志框架一样,新的API也支持变量参数的占位符功能。
log4j2 还支持其他一些很棒的功能,像Markers 和 Flow Traces:
private Logger logger = LogManager.getLogger(MyApp.class.getName());
private static final Marker QUERY_MARKER = MarkerManager.getMarker("SQL");
...
public String doQuery(String table) {
logger.entry(param);
logger.debug(QUERY_MARKER, "SELECT * FROM {}", table);
return logger.exit();
}
Markers可以帮助你很快地找到具体的日志项(Log Entries)。而在某个方法的开头和结尾调用Flow Traces中的一些方法,你可以在日志文件中看到很多新的跟踪层次的日志项,也就是说,你的程序工作流(Program Flow)被记录下来了。下面是Flow Traces的一些例子:
9:08:07.056 TRACE com.test.TestService 19 retrieveMessage - entry 9:08:07.060 TRACE com.test.TestService 46 getKey - entry
二、强大的配置功能(Powerful Configuration)
log4j2的配置变得非常简单。如果你习惯了之前的配置方式,也不用担心,你只要花少许时间就可以从之前的方式转到新的方式。请看下面的配置文件(默认):
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
上面说的知识一部分改进,你还可以自动重新加载配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<configuration monitorInterval="30">
...
</configuration>
监控的时间间隔单位为秒,最小值是5。这意味着,log4j2在配置改变的情况下可以重新配置日志记录行为。如果值设置为0或者负数,log4j2不会对配置变更进行检测。最为称道的一点是:不像其他日志框架,log4j2在重新配置的时候不会丢失之前的日志记录。
三、java 5并发性(Concurrency)
有一段文档是这样描述的:“log4j2 利用 Java 5 中的并发特性支持,尽可能地执行最低层次的加锁...”。Apache log4j2 解决了许多在log4j1.x 中仍然存留的死锁问题。如果你的程序仍然饱受内存泄漏的折磨,请毫不犹豫地试一下log4j2。
使用
一、程序中如果使用Log4j2?
在你的程序中使用Log4j2之前必须确保log4j-api.jar和log4j-core.jar在程序的classpath中。使用Maven将下面的依赖加入pom.xml。
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.0</version>
</dependency>
</dependencies>
这里随便写个类,调用就是这么简单,log4j的核心在配置文件上,若不创建配置文件,使用默认配置文件。
问:那么默认的Level是多少呢?
答: 默认的输出地是console,默认的级别是ERROR级别。
/**
* Created by Ray on 2018/3/28 0028.
**/
public class Hello {
static Logger logger = LogManager.getLogger(Hello.class.getName());
public static void main(String[] args) {
logger.trace("entry"); //开始时调用
logger.error("Did it again!"); //error级别的信息
logger.info("我是info信息"); //info级别的信息
logger.debug("我是debug信息");
logger.warn("我是warn信息");
logger.fatal("我是fatal信息");
logger.log(Level.DEBUG,"我是debug信息"); //指定Level类型的调用
logger.trace("exit"); //结束时调用
}
}
输出结果:
代码跟输出不一致?
Log4j2 简介的更多相关文章
- logger(三)log4j2简介及其实现原理
一.log4j2简介 log4j2是log4j 1.x和logback的改进版,据说采用了一些新技术(无锁异步.等等),使得日志的吞吐量.性能比log4j 1.x提高10倍,并解决了一些死锁的bug, ...
- log4j2简介
Apache Log4j 2 Apache Log4j 2是对Log4j的升级,它比它的前辈Log4j 1提供了显著的改进.在解决Logback的架构中存在的一些固有问题时,提供了许多可用的改进. 特 ...
- log4j2笔记 #02# 启用异步日志
索引 参考 Making All Loggers Asynchronous 第一步,添加相应的disruptor库 第二步,设置系统属性log4j2.contextSelector 第三步,检验! 参 ...
- log4j2使用教程
Log4j2简介 log4j2是log4j 1.x 的升级版,2015年5月,Apache宣布log4j1.x 停止更新.最新版为1.2.17. log4j2参考了logback的一些优秀的设计, ...
- Log4j2基本使用入门
1.Log4j2简介 Apache Log4j 2是日志框架Log4j的升级, 它比其前身Log4j 1.x提供了重要的改进, 并且参考了Logback中许多有用的改进, 同时修复了Logback的一 ...
- Log4j2日志技术总结
前言 现在流行是SLF4j和Log4j2组合的日志技术,但为了日志技术归类,故前因后果都将做一下介绍. 市场上流行的日志框架 JUL java util logging Java开发团队开发,Jdk原 ...
- 《手把手教你》系列基础篇(八十七)-java+ selenium自动化测试-框架设计基础-Log4j 2实现日志输出-上篇(详解教程)
1.简介 Apache Log4j 是一个非常古老的日志框架,并且是多年来最受欢迎的日志框架. 它引入了现代日志框架仍在使用的基本概念,如分层日志级别和记录器. 2015 年 8 月 5 日,该项目管 ...
- 日志组件二:log4j2
一.背景 随着业务服务(Server App)逐渐增加,我们的业务系统中的日志输出面临的问题越来越多,高并发下对磁盘io这块消耗的越来越大,因此,急需要一个高性能且最好能够支持异步输出日志的日志框架, ...
- Log4j2中的同步日志与异步日志
1.背景 Log4j 2中记录日志的方式有同步日志和异步日志两种方式,其中异步日志又可分为使用AsyncAppender和使用AsyncLogger两种方式. 2.Log4j2中的同步日志 所谓同步日 ...
随机推荐
- url 中文及特殊字符转码
#include <ctype.h> std::string UrlEncode(const std::string& szToEncode) { std::string s ...
- 使用gitflow流程完成功能时报错
报错 fatal: could not read Username for 'https://github.com': ······ 原因 使用https方式的时候 在https url 里面没有用户 ...
- 201771010126 王燕《面向对象程序设计(java)》第八周学习总结
实验六 接口的定义与使用 实验时间 2018-10-18 1.实验目的与要求 (1) 掌握接口定义方法 JAVA中通过interface关键字定义接口: 接口中只能定义public static fi ...
- redis的编译安装
参考文献 https://www.cnblogs.com/JiangLe/p/5878160.html https://www.cnblogs.com/stulzq/p/9288401.html re ...
- mysql 查询 两个表中不同字段的 和,并通过两个表的时间来分组
( SELECT sum( a.cost_sum ) AS sum_cost, sum( a.phone_sum ) AS sum_phone, sum( a.arrive_sum ) AS sum_ ...
- 【Java算法學習】斐波那契數列問題-兔子產子經典問題
/** * 用遞推算法求解斐波那契數列:Fn = Fn-2 +Fn-1; */ import java.util.*; public class Fibonacci { public static v ...
- linux sed 用法
目录 Overview 命令行选项 Command-Line Options manual http://www.gnu.org/software/sed/manual/sed.html Overvi ...
- rand和srand的用法
首先我们要对rand&srand有个总体的看法:srand初始化随机种子,rand产生随机数,下面将详细说明. rand(产生随机数)表头文件: #include<stdlib.h> ...
- 匹配字符串中的s开头的单词,并替换
String s="now it's sping,but today is so cold!"; String a=s.replaceAll("s\\w+",& ...
- Fillder安装,如何解决证书无法导出
Q: 安装配置完Fidder之后,点击导出证书,提示Creation of the root ceritificate was not successful A :需执行dos命名. -cy aut ...