Java Log4j和Log4j2的区别
Java Log4j和Log4j2的区别
一、核心JAR包
log4j核心包:log4j:log4j:[version]
而log4j2的核心包有2个:
org.apache.logging.log4j:log4j-core:[version]
org.apache.logging.log4j:log4j-api:[version]
二、配置文件
log4j:通过一个log4j.properties的文件作为主配置文件
以下是一个输出到控制台的例子
log4j.rootLogger=INFO,consolelog4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [%thread] [%c] >>> %m%n
%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss,SSS},输出类似:2011-10-18 22:10:28,921
%r: 输出自应用启动到输出该log信息耗费的毫秒数
%c: 输出日志信息所属的类目,通常就是所在类的全名
%t: 输出产生该日志事件的线程名
%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%: 输出一个"%"字符
%F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行
log4j2:采用的是.xml,.json或者.jsn这种方式来做,比如log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="log4j2: %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console></Appenders><Loggers><Root level="info"><AppenderRef ref="Console"/></Root></Loggers>
</Configuration>
至于更加深入的配置分析,可以查看各自的文档
三、调用方式
log4j:
import org.apache.log4j.Logger;
private static final Logger logger = Logger.getLogger(App.class);
log4j2:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
private static final Logger logger = LogManager.getLogger(App.class);
四、关于org.slf4j
这个只是一个日志门面模式,方面我们在各种不同的日志实现中切换,而不需要修改写日志的代码,如果org.slf4j找不到实现,
会抛出Failed to load class org.slf4j.impl.StaticLoggerBinder(see:https://www.slf4j.org/codes.html#StaticLoggerBinder)
引用库:
implementation 'org.slf4j:slf4j-api:[version]'
implementation 'org.slf4j:slf4j-log4j12:[version]'
调用方式
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(App.class);
org.slf4j使用log4j2,我们仅仅修改引用的包即可,代码不需要变更
implementation 'org.slf4j:slf4j-api:1.7.26'
implementation 'org.apache.logging.log4j:log4j-core:2.12.0'
implementation 'org.apache.logging.log4j:log4j-api:2.12.0'
implementation 'org.apache.logging.log4j:log4j-slf4j-impl:2.12.0'
日志库冲突问题
我们项目使用了logback,但是其他包又引入了log4j2,这样会导致日志实现冲突,SLF4J: Class path contains multiple SLF4J bindings.(see:http://www.slf4j.org/codes.html#multiple_bindings)
解决方式:去除其他日志库,确保只有一个日志库实现
注意:即使存在多个绑定,slf4j也会选择一个日志框架/实现并与之绑定。slf4j选择绑定的方式由jvm决定,对于所有实际用途,都应视为随机的。从1.6.6版开始,slf4j将命名它实际绑定到的框架/实现类。
Java Log4j和Log4j2的区别相关推荐
- java log4j2_老生常谈Log4j和Log4j2的区别(推荐)
相信很多程序猿朋友对log4j都很熟悉,log4j可以说是陪伴了绝大多数的朋友开启的编程.我不知道log4j之前是用什么,至少在我的生涯中,是log4j带我开启的日志时代. log4j是Apache的 ...
- Log4j和Log4j2的区别
log4j是Apache的一个开源项目,log4j2和log4j是一个作者,只不过log4j2是重新架构的一款日志组件,他抛弃了之前log4j的不足,以及吸取了优秀的logback的设计重新推出的一款 ...
- Slf4j与log4j及log4j2的关系及使用方法
Slf4j与log4j及log4j2的关系及使用方法 slf4j slf4j仅仅是一个为Java程序提供日志输出的统一接口,并不是一个具体的日志实现方案,就比如JDBC一样,只是一种规则而已,所以单独 ...
- Log4j(四)——Log4j1与Log4j2的区别
前言 几乎每个大型应用程序都包含自己的日志或跟踪API.为了符合这一规则,欧盟SEMPRER项目决定编写自己的跟踪API.这是在1996年初.经过无数次的增强.几个版本和大量的工作之后,API演变成了 ...
- java常用日志框架日志门面及实现 SLF4J 、Jboss-logging 、JCL、Log4j、Logback、Log4j2、JUL,springboot集成 log4j、log4j2
java常用日志框架日志门面SLF4J .Jboss-logging .JCL.Log4j及实现 Logback.Log4j2.JUL,springboot集成 log4j.log4j2 .logba ...
- Java各类日志门面(slf4j,commons-logging)和日志框架(log4j,logback)联系和区别
日志门面 1.Apache通用日志接口(commons-logging.jar) Apache Commons包中的一个,包含了日志功能,必须使用的jar包.这个包本身包含了一个Simple Logg ...
- Java日志体系日志门面(Slf4j)日志实现(Log4j、Log4j2)详解
1.背景 近日发生两次因日志使用不当导致的线上问题: 1.应用明明配置了info日志级别,却打印大量的debug日志,导致磁盘IO较高,很快就报磁盘空间不足告警 2.应用服务启动后报StackOver ...
- 一文讲尽门面日志slf4j和log4j、log4j2、logback依赖jar引用关系
前言 之前都是使用SparkStreaming开发,最近打算学习一下Flink,就从官网下载了Flink 1.11,打算搞一个客户端,将程序提交在yarn上.因为Flink从1.7之后就不再提供Had ...
- java log4j基本配置及日志级别配置详解,java基础面试笔试题
我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...
最新文章
- 2011年 软件所信息安全国家重点实验室复试回忆
- MongoDB中如何优雅地删除大量数据
- asp.net core结合NLog搭建ELK实时日志分析平台
- AS3读取XML文档
- 矩阵论思维导图_《实变函数论》 江泽坚 3rd 思维导图与笔记整理
- html引入php文件中的函数,手把手教你在html中引入另一个html文件的方法(详解)...
- 设计灵感|化繁杂为明晰!如何把信息类海报做得好看?
- AUTOCAD建模足球实体
- 微软 .NET Core 3.0 版本发布
- Redis下载部署配置运行及修改登录地址、端口和密码
- 移动互联网周刊第二期,不错,推荐给大家
- Python对YouTube视频统计趋势数据集分析
- android 视频上传网络异常,App上传视频(或大文件)失败怎么办?
- 在 JavaScript 中隐藏表格行
- 冰雪第一天历险 - 2014 年的冬天第一场站得住的雪?
- 全排列的递归算法(C语言)
- 前程无忧助力,再次举办湖北武汉网络专场招聘会
- 解决 golang 中 wrote more than the declared Content-Length
- golang for嵌套循环中break 的注意事项和使用细节: break 语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
- ubuntu大于4T分区 12T硬盘分区
热门文章
- [JSOI2016]扭动的回文串
- html加纵向滚动条,添纵向滚动条
- Missing artifact com.microsoft.sqlserver:sqljdbc4:jar:4.0解决方案
- 51Nod基础组(Python)
- 基于MindSpore的MASS网络实现
- C++prime读书笔记(二)C++标准库:IO、容器、泛型算法、动态内存
- Firefox火狐浏览器主密码暴力破解
- 十五天学会Autodesk Inventor,看完这一系列就够了(九),主题/色彩/单位设置
- react 谷歌地图_谷歌地图与React
- 【破解利器】PE工具篇(PE编辑,查看等操作)