浅谈Log4j和Log4j2的区别

 

相信不少程序猿朋友对log4j都很熟悉,log4j能够说是陪伴了绝大多数的朋友开启的编程。我不知道log4j以前是用什么,至少在个人生涯中,是log4j带我开启的日志时代。

log4j是Apache的一个开源项目,咱们不去考究它的起源时间,可是据我了解,log4j 1已经再也不更新了。 
下面引用官网的原文:程序员

End of Life On August 5, 2015 the Logging Services Project Management 
Committee announced that Log4j 1.x had reached end of life. For 
complete text of the announcement please see the Apache Blog. Users of 
Log4j 1 are recommended to upgrade to Apache Log4j 2. 
是的,log4j中止于1.x版本,迎来了log4j 2,也就是咱们今天要说的log4j 2.web

回顾log4j,曾给咱们留下了多少的回忆,我记得早些年,那时候mybatis仍是叫ibatis的时候,我为了配置ibatis控制台打印日志,纠结了多少个夜晚,最后配置出来时的那种喜悦感。废话很少说,下面我就以列举的方式来浅谈log4j和log4j 2的不一样之处。spring

1.配置文件类型 
log4j是经过一个.properties的文件做为主配置文件的,而如今的log4j 2则已经弃用了这种方式,采用的是.xml,.json或者.jsn这种方式来作,可能这也是技术发展的一个必然性,毕竟properties文件的可阅读性真的是有点差。apache

2.核心JAR包 
log4j只须要引入一个jar包便可,编程

<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>

 

 

而log4j 2则是须要2个核心json

<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.5</version> </dependency>

 

 

你们发现没,log4j和log4j 2的包路径是不一样的,Apache为了区分,包路径都更新了,这样你们甚至能够在一个项目中使用2个版本的日志输出哦!(不过我想大家没有那么调皮吧,嘿嘿)api

3.文件渲染 
log4j想要生效,咱们须要在web.xml中进行配置,markdown

<listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:config/log4j.properties</param-value> </context-param> <context-param> <param-name>log4jRefreshInterval</param-name> <param-value>60000</param-value> 

 

 

这段配置目的在于告诉工程去哪加载log4j的配置文件和定义一个扫描器,这样能够为所欲为的放置log4j配置文件。 
log4j2就比较简单,以maven工程为例,咱们只须要把log4j2.xml放到工程resource目录下就好了。你们记住一个细节点,是log4j2.xml,而不是log4j.xml,xml名字少个2都不行!!mybatis

  • 喜欢作学问的小伙伴,有兴趣能够去研究下,照我估计应该是在log4j2的包里面配置死了,并且你们能够尝试下怎么自定义log4j2.xml的位置。

4.Log调用 
log4j和log4j2调用都是很简单的。 
log4j:app

import org.apache.log4j.Logger; private final Logger LOGGER = Logger.getLogger(Test.class.getName());

log4j2:

import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; private static Logger logger = LogManager.getLogger(Test.class.getName());

 

 

5.配置文件方式 
最关键的最大的不一样,那就是配置文件的区别了,你们具体使用的时候再根据你的状况进行配置就好了。 
log4j2 例子以下:

<?xml version="1.0" encoding="UTF-8"?> <configuration status="error"> <!-- 先定义全部的appender --> <appenders> <!-- 这个输出控制台的配置 --> <Console name="Console" target="SYSTEM_OUT"> <!-- 控制台只输出level及以上级别的信息(onMatch),其余的直接拒绝(onMismatch) --> <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/> <!-- 这个都知道是输出日志的格式 --> <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> </Console> <!-- 文件会打印出全部信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用 --> <!-- append为TRUE表示消息增长到指定文件中,false表示消息覆盖指定的文件内容,默认值是true --> <File name="log" fileName="log/test.log" append="false"> <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> </File> <!-- 添加过滤器ThresholdFilter,能够有选择的输出某个级别以上的类别 onMatch="ACCEPT" onMismatch="DENY"意思是匹配就接受,不然直接拒绝 --> <File name="ERROR" fileName="logs/error.log"> <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/> </File> <!-- 这个会打印出全部的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份创建的文件夹下面并进行压缩,做为存档 --> <RollingFile name="RollingFile" fileName="logs/web.log" filePattern="logs/$${date:yyyy-MM}/web-%d{MM-dd-yyyy}-%i.log.gz"> <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/> <SizeBasedTriggeringPolicy size="2MB"/> </RollingFile> </appenders> <!-- 而后定义logger,只有定义了logger并引入的appender,appender才会生效 --> <loggers> <!-- 创建一个默认的root的logger --> <root level="trace"> <appender-ref ref="RollingFile"/> <appender-ref ref="Console"/> <appender-ref ref="ERROR" /> <appender-ref ref="log"/> </root> </loggers> </configuration> 

 

 

总结: 
技术老是在不断进步的,咱们不能局限在已知的知识领域中,要不断去创新,去尝试!

附:

日志的级别:     
咱们如今要调用logger的方法,不过在这个Logger对象中,有不少方法,因此要先了解log4j的日志级别,log4j规定了默认的几个级别:trace<debug<info<warn<error<fatal等。这里要说明一下:    

  1. 级别之间是包含的关系,意思是若是你设置日志级别是trace,则大于等于这个级别的日志都会输出。
  2. 基本上默认的级别没多大区别,就是一个默认的设定。你能够经过它的API本身定义级别。你也能够随意调用这些方法,不过你要在配置文件里面好好处理了,不然就起不到日志的做用了,并且也不易读,至关于一个规范,你要彻底定义一套也能够,不用没多大必要。从咱们实验的结果能够看出,log4j默认的优先级为ERROR或者WARN(其实是ERROR)    
  3. 这不一样的级别的含义你们都很容易理解,这里就简单介绍一下:

    • trace: 
      是追踪,就是程序推动如下,你就能够写个trace输出,因此trace应该会特别多,不过不要紧,咱们能够设置最低日志级别不让他输出。

    debug: 调试么,我通常就只用这个做为最低级别,trace压根不用。是在没办法就用eclipse或者idea的debug功能就行了么。

    • info: 输出一下你感兴趣的或者重要的信息,这个用的最多了。

    • warn: 有些信息不是错误信息,可是也要给程序员的一些提示,相似于eclipse中代码的验证不是有error 
      和warn(不算错误可是也请注意,好比如下depressed的方法)。

    • error: 错误信息。用的也比较多。

    • fatal: 级别比较高了。重大错误,这种级别你能够直接中止程序了,是不该该出现的错误么!不用那么紧张,其实就是一个程度的问题。

相关文章
相关标签/搜索