log4j2中文手册

合集下载

log4j2配置文件log4j2.xml详解(转载)

log4j2配置文件log4j2.xml详解(转载)

log4j2配置⽂件log4j2.xml详解(转载)此博⽂转载⾃阿豪聊⼲货的“”,博⽂地址:https:///hafiz/p/6170702.html⼀、背景昨天了解了⼀下slf4j和log4j2,想要进⾏总结记录,配置步骤⼗分简单,唯⼀需要具体了解的就是log4j2.xml的配置,于是找到了这篇博⽂,配置讲解⼗分详细,便转载作记录,再次感谢阿豪聊⼲货。

以下原⽂: 最近由于项⽬的需要,我们把log4j 1.x的版本全部迁移成log4j 2.x 的版本,那随之⽽来的slf4j整合log4j的配置()以及log4j2配置⽂件的详解,就需要我们来好好聊⼀聊了。

本⽂就专门来讲解下log4j2.xml配置⽂件的各项标签的意义。

⼆、配置全解 1.关于配置⽂件的名称以及在项⽬中的存放位置 log4j 2.x版本不再⽀持像1.x中的.properties后缀的⽂件配置⽅式,2.x版本配置⽂件后缀名只能为".xml",".json"或者".jsn". 系统选择配置⽂件的优先级(从先到后)如下: (1).classpath下的名为log4j2-test.json 或者log4j2-test.jsn的⽂件. (2).classpath下的名为log4j2-test.xml的⽂件. (3).classpath下名为log4j2.json 或者log4j2.jsn的⽂件. (4).classpath下名为log4j2.xml的⽂件. 我们⼀般默认使⽤log4j2.xml进⾏命名。

如果本地要测试,可以把log4j2-test.xml放到classpath,⽽正式环境使⽤log4j2.xml,则在打包部署的时候不要打包log4j2-test.xml即可。

2.缺省默认配置⽂件<?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>3.配置⽂件节点解析 (1).根节点Configuration有两个属性:status和monitorinterval,有两个⼦节点:Appenders和Loggers(表明可以定义多个Appender和Logger). status⽤来指定log4j本⾝的打印⽇志的级别. monitorinterval⽤于指定log4j⾃动重新配置的监测间隔时间,单位是s,最⼩是5s. (2).Appenders节点,常见的有三种⼦节点:Console、RollingFile、File. Console节点⽤来定义输出到控制台的Appender. name:指定Appender的名字. target:SYSTEM_OUT 或 SYSTEM_ERR,⼀般只设置默认:SYSTEM_OUT. PatternLayout:输出格式,不设置默认为:%m%n. File节点⽤来定义输出到指定位置的⽂件的Appender. name:指定Appender的名字. fileName:指定输出⽇志的⽬的⽂件带全路径的⽂件名. PatternLayout:输出格式,不设置默认为:%m%n. RollingFile节点⽤来定义超过指定⼤⼩⾃动删除旧的创建新的的Appender. name:指定Appender的名字. fileName:指定输出⽇志的⽬的⽂件带全路径的⽂件名. PatternLayout:输出格式,不设置默认为:%m%n. filePattern:指定新建⽇志⽂件的名称格式. Policies:指定滚动⽇志的策略,就是什么时候进⾏新建⽇志⽂件输出⽇志. TimeBasedTriggeringPolicy:Policies⼦节点,基于时间的滚动策略,interval属性⽤来指定多久滚动⼀次,默认是1 hour。

log4j2中文手册

log4j2中文手册

Log4j2使用手册一.Log4j2介绍Log4j1.x 被广泛应用于应用程序,但是近年发展明显放缓,因为要维持较老java版本的使用,使得log4j1.x 的发展更困难。

而作为其代替品,slf4j/logback 做出了许多必要改进,为什么还需要log4j2? 主要有以下几个原因: (1)Log4j2被设计用作审计日志框架, log4j 和logback 在重载配置时,都会丢失日志时间,而log4j2不会。

Logback中appenders中的异常对于应用来说是不可见的,log4j2可以配置异常向应用渗透。

(2)Log4j2 包含基于LMAX Disruptor library的下一代无锁Asynchronous Loggers ,在多线程环境下,Asynchronous Loggers 相比slf4j / logback 提高了10倍以上的吞吐量,并且有着更低的延时。

(3)Log4j2的插件机制,使得在不需要修改框架的情况下,通过添加 Appenders, Filters, Layouts, Lookups 轻松扩展框架。

(4)简单的插件配置,无需指定具体类名即可在configuration 中配置插件。

(5)支持自定义日志级别,可以在代码或者configuration 中自定义日志级别。

(6)支持lambda表达式,java8的应用可以在请求日志级别启用时使用lambda表达式懒构建一个日志消息,不需要显示的日志级别检查,使得代码更简洁。

(7)支持消息对象,消息允许支持有趣和复杂的结构,传递到日志记录系统,并且可以高效的操作。

用户可以自由创建消息类型和编写Layouts, Filters and Lookups 来操作这些消息。

(8)Log4j1在Appenders 上支持Filters。

logback增加了TurboFilters,允许在日志事件在处理前进行过滤。

Log4j2可以配置Filters 在Logger后者Appender 前运行。

log4j2动态修改日志级别及拓展性使用

log4j2动态修改日志级别及拓展性使用

log4j2动态修改⽇志级别及拓展性使⽤⼀、供参考的完整⽇志配置<?xml version="1.0" encoding="UTF-8"?><!-- 配置LoggerConfig,即Appenders的⽇志级别为WARN --><Configuration status="WARN"><!-- 定义下⾯的引⽤名 --><Properties><property name="basePath">${sys:vmparam}</property><property name="filePath">${basePath}/app.log</property></Properties><!-- Appenders⽀持配置多个Appender,⽀持向不同的⽬标输送⽇志,本例为配置向控制台输出 --><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console><!-- 将⽇志输出到指定位置的⽂件中 --><RollingFile name="RollingFile" fileName="${filePath}"filePattern="logs/$${date:yyyy-MM}/app-%d{yyyy-MM-dd-HH}-%i.log.gz"><Policies><!-- interval单位为filePattern最后⼀个单位,此处为6⼩时,modulate若为true,则⽇志时间将以0点为边界进⾏偏移计算,由于加了.gz策略,所以此处意思为每隔6⼩时,便会新⽣成⼀个log4j2的压缩⽂件,当每个⽂件超过250M时,也会新⽣成⼀个log4j2的压缩⽂件 --><TimeBasedTriggeringPolicy interval="6" modulate="true"/><SizeBasedTriggeringPolicy size="250 MB"/></Policies><!-- 滚动策略,⽇志⽂件最多保留20个 --><DefaultRolloverStrategy max="20"/><!-- 最多备份30天以内||⽇志⽂件⼤⼩达到100GB的⽇志||⽂件数量超过⼗个此处为策略限制,Delete中可以按⾃⼰需要⽤正则表达式编写 --><DefaultRolloverStrategy><Delete basePath="${filePath}" maxDepth="1"><IfFileName glob="logs_*.log"/><IfLastModified age="30d"/><IfAccumulatedFileSize exceeds="100 GB"/><IfAccumulatedFileCount exceeds="10"/></Delete></DefaultRolloverStrategy></RollingFile></Appenders><!-- Loggers⽀持配置多个Logger,可引⽤不同的⽬标Appender,也可根据业务需求定制特定要求的Appender --><Loggers><AsyncLogger name="AsyncLogger" level="trace"><appender-ref ref="Console"/><appender-ref ref="RollingFile"/></AsyncLogger><asyncRoot level="trace"><appender-ref ref="Console"/></asyncRoot><Root level="info"><!-- <AppenderRef ref="Console" /> --><AppenderRef ref="RollingFile"/></Root><!-- 第三⽅⽇志系统 --><logger name="org.springframework" level="INFO" additivity="false"><appender-ref ref="Console"/></logger><logger name="ty" level="warn"/><logger name="org.apache.http" level="warn"/><logger name="org.mongodb.driver" level="INFO"/><logger name="ty" level="warn"/><logger name="org.springframework.data.redis" level="INFO"/></Loggers></Configuration>⼆、动态修改⽇志级别Collection<org.apache.logging.log4j.core.Logger> current = LoggerContext.getContext(false).getLoggers();Collection<org.apache.logging.log4j.core.Logger> notcurrent = LoggerContext.getContext().getLoggers();Collection<org.apache.logging.log4j.core.Logger> allConfig = current;allConfig.addAll(notcurrent);for (org.apache.logging.log4j.core.Logger log:allConfig){log.setLevel(Level.DEBUG);} 三、⾃定义appender 以上介绍,均依赖于log4j2提供的官⽅配置,当对⽇志的业务逻辑复杂时,光靠配置也许满⾜不了需要,此时我们会想⾃⼰能操控打印的⽇志,做⽇志的路由,或保存等操作,这个时候就需要有⾃定义的appender,可以配置的就靠配置完成,不能的就⾃⼰写代码⼲预,⽽log4j2刚好提供了这样的拓展性。

log4j2基础入门(超详细)

log4j2基础入门(超详细)

log4j2基础⼊门(超详细)⼀.导包 (2)将下载的.zip(windows中)加压,并将1. log4j-api-×××.jar2. log4j-core-×××.jar 导⼊项⽬中,并BuildPath⼆.调⽤ (1)log4j的级别 log4j规定了默认的⼏个级别:all<trace<debug<info<warn<error<fatal<off (off是最⾼等级,即关闭所有⽇志记录;all是最低等级,即打开所有⽇志记录)Level描述ALL各级包括⾃定义级别DEBUG指定细粒度信息事件是最有⽤的应⽤程序调试ERROR错误事件可能仍然允许应⽤程序继续运⾏FATAL指定⾮常严重的错误事件,这可能导致应⽤程序中⽌INFO指定能够突出在粗粒度级别的应⽤程序运⾏情况的信息的消息OFF这是最⾼等级,为了关闭⽇志记录TRACE指定细粒度⽐DEBUG更低的信息事件WARN指定具有潜在危害的情况 (2)log4j测试 导包后测试⼀下log4j。

代码如下: public class Log4jTest {private static Logger logger = LogManager.getLogger(Log4jTest.class.getName());public static void main(String[] args) {logger.trace("entry"); //trace级别的信息,和logger.entry() 基本⼀个意思,但已经过时logger.debug("我是debug信息");("我是info信息");logger.warn("我是warning信息");logger.error("我是error信息");logger.fatal("我是fatal信息");logger.trace("exit");////和entry()对应的结束⽅法,和logger.exit()⼀个意思,同样已经过时}} 输出信息:ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console. Set system property 'log4j2.debug' to show Log4j2 internal initialization logging. 09:48:26.531 [main] ERROR com.sp.test.Log4jTest - 我是error信息09:48:26.533 [main] FATAL com.sp.test.Log4jTest - 我是fatal信息 结果只输出了error和fatal的信息,并且给出了原因,原因就是:没有找到log4j2的配置⽂件,便使⽤了默认的配置,仅仅显⽰error及以上级别的⽇志。

log4j2RollingRandomAccessFile配置过程

log4j2RollingRandomAccessFile配置过程

log4j2RollingRandomAccessFile配置过程log4j2 RollingRandomAccessFile配置⼀、需求背景1. ⽇志按⼩时压缩成zip⽂件。

2. 仅保存距离当前时间最近24⼩时的历史压缩⽂件。

3. 压缩封存的zip⽂件,按照零点为参考点纠偏。

4. 将com.roadway.acceptor.base.DebugUtils类的⽇志输出到指定⽂件,且不再输出到其他⽂件。

⼆、log4j2 配置实现<?xml version="1.0" encoding="UTF-8"?><Configuration status="INFO" monitorInterval="120"><properties><property name="MSG_LOG_HOME">/data/gpslog</property></properties><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d [%t] %-5p [%c] - %m%n" /></Console><RollingRandomAccessFile name="msgAppender" immediateFlush="true"fileName="${MSG_LOG_HOME}/msg.log"filePattern="${MSG_LOG_HOME}/backup/msg.%d{yyyyMMddHH}.zip"><Filters><ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/></Filters><PatternLayout pattern="%m%n" /><Policies><TimeBasedTriggeringPolicy interval="1" modulate="true"/></Policies><DefaultRolloverStrategy max="24"><Delete basePath="${MSG_LOG_HOME}" maxDepth="2"><IfFileName glob="*/msg.*.zip" /><IfLastModified age="24H" /></Delete></DefaultRolloverStrategy></RollingRandomAccessFile></Appenders><Loggers><AsyncLogger name="com.roadway.DebugUtils" additivity="FALSE" level="INFO"><appender-ref ref="msgAppender" /></AsyncLogger></Loggers></Configuration>三、配置说明1. monitorInterval,博客配置的为120,单位为秒。

log4j2的配置

log4j2的配置

log4j2的配置log4j2的配置•log4j2.xml配置代码•解释及问题•o一.结果说明o二.配置说明o▪Filter▪▪1、ThresholdFilter▪2、RegexFilter▪3、TimeFiltero三.踩过的坑o▪1、ThresholdFilter ERROR 错误▪2、依赖问题▪3、Spring5.x的集成log4j2.xml配置代码<?xml version="1.0" encoding="UTF-8"?><!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --><!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出--><!--monitorInterval:Log4j能够自动检测修改配置文件和重新配置本身,设置间隔秒数--><configuration status="WARN" monitorInterval="30"><!--先定义所有的appender--><appenders><!--这个输出控制台的配置--><console name="Console" target="SYSTEM_OUT"><!--输出日志的格式--><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/></console><!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用--> <!-- <File name="log" fileName="logs/test.log" append="false">--><!-- <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>--><!-- </File>--><!-- 这个会打印出所有的info级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--><RollingFile name="RollingFileInfo" fileName="logs/info.log"filePattern="logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log"><!-- >= WARN级别的,拒绝!--><ThresholdFilter level="warn" onMatch="DENY" onMismatch="ACCEPT"/><!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/><Policies><TimeBasedTriggeringPolicy/><SizeBasedTriggeringPolicy size="100 MB"/></Policies></RollingFile><RollingFile name="RollingFileWarn" fileName="logs/warn.log"filePattern="logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log"><ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/><Policies><TimeBasedTriggeringPolicy/><SizeBasedTriggeringPolicy size="100 MB"/></Policies><!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 --><DefaultRolloverStrategy max="20"/></RollingFile><RollingFile name="RollingFileError" fileName="logs/error.log"filePattern="logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log"><ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/><Policies><TimeBasedTriggeringPolicy/><SizeBasedTriggeringPolicy size="100 MB"/></Policies></RollingFile></appenders><!--然后定义logger,只有定义了logger并引入的appender,appender才会生效--><loggers><!--过滤掉spring和mybatis的一些无用的DEBUG信息--><logger name="org.springframework" level="INFO"></logger><logger name="org.mybatis" level="INFO"></logger><root level="all"><appender-ref ref="Console"/><appender-ref ref="RollingFileInfo"/><appender-ref ref="RollingFileWarn"/><appender-ref ref="RollingFileError"/></root></loggers></configuration>解释及问题这里我踩了不少的坑,网上的资料五花八门很乱,复制粘贴的居多。

log4j及其log4j2的使用

log4j及其log4j2的使用

log4j及其log4j2的使⽤简单的说 log4j2 是log4j2的升级版,据说采⽤了⼀些新技术(⽆锁异步、等等),使得⽇志的吞吐量、性能⽐log4j 1.x提⾼10倍,并解决了⼀些死锁的bug,⽽且配置更加简单灵活。

其使⽤⽅式与使⽤配置与log4j相同。

新建⼀个testlog的maven⼯程依赖相关的log4j2的jar包<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.5</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.5</version></dependency>log4j2⽂件读取类型:log4j是apache的⼀个开源项⽬,在写这篇博客的时候已经发布了2.0的beta版本,⾸先需要注意的是,log4j 2.0与以往的1.x有⼀个明显的不同,其配置⽂件只能采⽤.xml, .json或者 .jsn。

在默认情况下,系统选择configuration⽂件的优先级如下:(classpath为scr⽂件夹)1. classpath下名为 log4j-test.json 或者log4j-test.jsn⽂件2. classpath下名为 log4j2-test.xml3. classpath下名为 log4j.json 或者log4j.jsn⽂件4. classpath下名为 log4j2.xml新建⼀个log4j2.xml⽂件放在src/main/resources⽂件夹下log4j2.xml相关的配置内容如下所⽰:<?xml version="1.0" encoding="UTF-8"?><!-- log4j2使⽤说明:使⽤⽅式如下:private static final Logger logger = LogManager.getLogger(实际类名.class.getName());2、⽇志说明:(1)请根据实际情况配置各项参数(2)需要注意⽇志⽂件备份数和⽇志⽂件⼤⼩,注意预留⽬录空间(3)实际部署的时候backupFilePatch变量需要修改成linux⽬录--><configuration status="error"><Properties><Property name="fileName">front.log</Property><Property name="backupFilePatch">d:/usr/log/</Property></Properties><!--先定义所有的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><!--这个会打印出所有的信息,每次⼤⼩超过size,则这size⼤⼩的⽇志会⾃动存⼊按年份-⽉份建⽴的⽂件夹下⾯并进⾏压缩,作为存档--><RollingFile name="RollingFile" fileName="${backupFilePatch}/${fileName}"filePattern="${backupFilePatch}$${date:yyyy-MM}/app-%d{yyyyMMddHHmmssSSS}.log.gz"><PatternLayoutpattern="%d{yyyy.MM.dd 'at' HH:mm:ss.SSS z} %-5level %class{36} %L %M - %msg%xEx%n" /><!-- ⽇志⽂件⼤⼩ --><SizeBasedTriggeringPolicy size="20MB" /><!-- 最多保留⽂件数 --><DefaultRolloverStrategy max="20"/></RollingFile></appenders><!--然后定义logger,只有定义了logger并引⼊的appender,appender才会⽣效--><loggers><!--建⽴⼀个logger,此logger监听name对应的包名下的⽇志输出,level表⽰⽇志级别--><Logger name="testlog" level="info" additivity="true"><AppenderRef ref="RollingFile" /></Logger><!--建⽴⼀个默认的root的logger--><Root level="error"><AppenderRef ref="Console" /></Root></loggers></configuration>Configuration标签中的常⽤元素说明:monitorInterval:Log4j 2 定期检查和应⽤配置⽂件的时间间隔(单位:秒,如果更改配置⽂件,不⽤重启系统)。

使用log4j2自定义配置文件位置和文件名(附log4j2.xml配置实例)

使用log4j2自定义配置文件位置和文件名(附log4j2.xml配置实例)

使⽤log4j2⾃定义配置⽂件位置和⽂件名(附log4j2.xml配置实例)⽬录log4j2⾃定义配置⽂件位置和⽂件名web.xml配置⽣效配置⽂件⽇志配置⽂件实例log4j2.xml配置及例⼦1.使⽤log4j2需要下载包2.配置⽂件可以有三种格式3.⽇志记录有两种⽅法4.我⽤的xml的配置log4j2⾃定义配置⽂件位置和⽂件名我们使⽤log4j2⼀般做法是将log4j2.xml⽂件放在资源⽂件夹根⽬录。

对于有强迫症的开发者来说,我更喜欢在资源⽂件夹下新建包或⽂件夹,然后把配置⽂件放在⾥⾯。

本博客将介绍如何⾃定义log4j2.xml⽂件的位置和⽂件名。

web.xml配置<!-- 系统⽇志配置监听器 --><listener><listener-class>edu.example.holder.system.Log4j2ConfigListener</listener-class></listener><context-param><description>⽇志配置⽂件的路径</description><param-name>log4j.configurationFile</param-name><param-value>log4j/log4j2.xml</param-value></context-param>Log4j2ConfigListener类是⾃定义的类,实现ServletContextListener接⼝,这样tomcat启动时可以更改⽇志配置⽂件的默认路径和⽂件名。

⽣效配置⽂件package edu.example.holder.system;import java.util.Enumeration;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import org.apache.logging.log4j.core.config.Configurator;public class Log4j2ConfigListener implements ServletContextListener{private static final String KEY = "log4j.configurationFile";@Overridepublic void contextDestroyed(ServletContextEvent arg0){}@Overridepublic void contextInitialized(ServletContextEvent arg0){String fileName = getContextParam(arg0);Configurator.initialize("Log4j2", "classpath:" + fileName);}@SuppressWarnings("unchecked")private String getContextParam(ServletContextEvent event) {Enumeration<String> names = event.getServletContext().getInitParameterNames();while (names.hasMoreElements()){String name = names.nextElement();String value = event.getServletContext().getInitParameter(name);if(name.trim().equals(KEY)){return value;}}return null;}}⽇志配置⽂件实例<?xml version="1.0" encoding="UTF-8"?><!--status : 这个⽤于设置log4j2⾃⾝内部的信息输出,可以不设置,当设置成trace时,会看到log4j2内部各种详细输出monitorInterval : Log4j能够⾃动检测修改配置⽂件和重新配置本⾝, 设置间隔秒数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Log4j2使用手册一.Log4j2介绍Log4j1.x 被广泛应用于应用程序,但是近年发展明显放缓,因为要维持较老java版本的使用,使得log4j1.x 的发展更困难。

而作为其代替品,slf4j/logback 做出了许多必要改进,为什么还需要log4j2? 主要有以下几个原因: (1)Log4j2被设计用作审计日志框架, log4j 和logback 在重载配置时,都会丢失日志时间,而log4j2不会。

Logback中appenders中的异常对于应用来说是不可见的,log4j2可以配置异常向应用渗透。

(2)Log4j2 包含基于LMAX Disruptor library的下一代无锁Asynchronous Loggers ,在多线程环境下,Asynchronous Loggers 相比slf4j / logback 提高了10倍以上的吞吐量,并且有着更低的延时。

(3)Log4j2的插件机制,使得在不需要修改框架的情况下,通过添加 Appenders, Filters, Layouts, Lookups 轻松扩展框架。

(4)简单的插件配置,无需指定具体类名即可在configuration 中配置插件。

(5)支持自定义日志级别,可以在代码或者configuration 中自定义日志级别。

(6)支持lambda表达式,java8的应用可以在请求日志级别启用时使用lambda表达式懒构建一个日志消息,不需要显示的日志级别检查,使得代码更简洁。

(7)支持消息对象,消息允许支持有趣和复杂的结构,传递到日志记录系统,并且可以高效的操作。

用户可以自由创建消息类型和编写Layouts, Filters and Lookups 来操作这些消息。

(8)Log4j1在Appenders 上支持Filters。

logback增加了TurboFilters,允许在日志事件在处理前进行过滤。

Log4j2可以配置Filters 在Logger后者Appender 前运行。

(9)许多Logback的Appenders 不接受Layout,并且只能按照固定格式发送日志数据。

大部分log4j2 接收Layout配置,允许日志数据按照任何所需格式传输。

(10)L og4j1与logback 的Layouts 是返回一个String 类型,这可能导致一些编码问题。

Log4j2使用了简单的方式:返回一个byte 数组。

这以为着Layouts 可以用在几乎任何appenders ,而不仅仅是写入OutputStream。

(11)S yslog appender 支持TCP与UDP,以及BSD syslog 和RFC5424格式。

(12)L og4j2 得益于java5的并发支持,将锁的可能降到最低水平。

Log4j1 有已知的死锁问题,Logback也需要使用synchronization 来保持在相当高的锁级别。

(13)A pache 开源二.Log4j2架构1.Log4j2类图应用程序调用Log4j API 时需要向LogManager 传入一个特定的名称来获取一个Logger实例。

LogManager 会定位一个合适的LoggerContext然后从中获取Logger 。

如果Logger必须新建,那么与之关联的LoggerConfig 遵守如下规则: (1)与Logger名称完全相同。

(2)父Logger 的名称。

(3)Root LoggerConfig 。

LoggerConfig 对象是根据configuration 配置中的Logger 声明创建的。

LoggerConfig 又与处理LogEvents 的LoggerConfig 关联。

2.日志层次logging API 相比于纯粹的System.out.println 最重要的不同是:logging API 可以禁用一些log语句输出的同时允许其他一些语句块输出。

这种能力建立在开发者按照一定规则将日志分类的基础上。

Log4j1.x 的层次关系是通过Loggers 之间的关系保持的。

而Log4j2.x 是通过LoggerConfig 对象来维持这种层次关系的。

Loggers 与LoggerConfigs 都是带名称的实体。

Logger名称是大小写敏感的,并且符合如下命名层级规则:一个LoggerConfig 的名字是另外一个LoggerConfig 名字加上 . 和一些后缀字符。

那么这个LoggerConfig 是另外的LoggerConfig 的子类。

类似于java 的package 路径。

例如: 一个名称为"com.foo"的LoggerConfig 是一个名称为"com.foo.Bar" 的LoggerConfig 的父类。

类似的,“java” 是"java.util"的父类和"java.util.Vector" 的祖先类。

开发人员对这样的命名方案应该很熟悉。

也可以用如下简便方式:其他的Logger 可以使用的静态方法根据传入的名称获得。

3.LoggerContextLoggerContext 作为日志系统的锚点(用于根据日志名称定位日志输出信息的Logger),在不同的环境中,一个应用系统中可能存在多个有效的LoggerContexts,4.Configuration每个LoggerContext有一个有效的Configuration。

Configuration包括所有的Appenders,上下文过滤器,LoggerConfigs与包含StrSubstitutor的引用信息。

在配置重载期间,两个Configuration共存,一旦所有的Logger重定向到新的Configuration,旧的Configuration将停用和丢弃。

5.LoggerLoggers是调用LogManager.getLogger静态方法创建的。

Logger 本身不直接执行动作。

它只有一个名称,并于一个LoggerConfig相关联。

它继承自AbstractLogger,当configuration被修改时,Loggers将关联修改后的LoggerConfig,从而改变这个Loggers的行为。

获取Loggers:使用相同的名称调用LogManager.getLogger 方法,总是返回完全相同的Logger对象。

例如:X和y 指向完全相同的Logger 对象。

Log4j 配置环境通常是在应用程序初始化时完成的。

最好的方式是读取配置文件。

Log4j很容易通过类名来命名,这可以在每个类初始化的时候完成Logger的初始化,Logger 的名称就等于类的完整路径,这是一个定义Logger的简单有效的方式。

当为日志文件输出具有Logger 名称的日志时,这种命名策略可以很容易看出一个日志消息的来源。

当然这只是一种比较常见的日志命名方式,log4j并没有对此进行限制,开发人员可以按照需求进行命名。

因为使用类名命名Logger是一个习惯用法。

一个便利的方法是使用LogManager.getLogger() 来获取类的全路径名称的Logger。

目前为止,使用类名来作为Logger 的名称是最好的方式。

6.LoggerConfig当Logger对象在logging configuration 中被定义时,LoggerConfig对象同时被创建。

LoggerConfig包含一组Filters来过滤传递到Appenders 的LogEvent。

LoggerConfig使用一组Appenders用来处理这些事件。

Log LevelsLoggerConfigs被分配一个日志级别,包括:TRACE, DEBUG, INFO, WARN, ERROR, FATAL 。

Log4j2 也支持自定义日志级别,另一种获得更多日志粒度的方式是使用Markers 。

Log4j1 与logback 都有日志级别继承的概念。

在Log4j2中,因为Loggers 和LoggerConfigs是2个不同的对象,所以这个概念的实现有所不同。

但是因为每个Loggers都关联一个相应的LoggerConfig,所以最终效果是相同的。

如果一个root LoggerConfig 没有配置日志级别,将分配一个默认级别。

在Example3 中,LoggerConfig配置,而Logger X.Y没有与其命名匹配的的LoggerConfig。

Example 4 各自有一个与名称完全匹配的LoggerConfig,而没有与名称完全匹配的LoggerConfig,所以使用与其名称有最长匹配度的X 的LoggerConfig。

Example 5 中因为路径匹配时按照 . 进行分割和匹配的。

Logger X中继承了日志级别。

下面的表格展示了logEvent(垂直方向) 与LoggerConfig(水平方向)的过滤方式:7.FilterLog4j2 提供了Filters,可以应用于控制权传递到LoggerConfig 之前,控制权传递到LoggerConfig 之后但是在调用Appenders 之前,控制权在传递到LoggerConfig之后,但是在调用一个指定的Appender 之前。

类似于防火墙的处理方式,每个FiltersAccept 意味着不会再调用其他Filters了,LogEvent 将被执行。

Deny 意味着立即忽略这个LogEvent,并将这个LogEvent 的控制权交还给它调用者。

尽管一个LogEvent 可能被一个Filter接收,但是这个LogEvent仍然没有被日志记录下来,发生这种情况的场景可能是LogEvent被pre-LoggerConfig Filter 接收了,但是却被LoggerConfig 拒绝了,或者被所有的Appenders 拒绝了。

8.Appender由logger的不同来决定一个logging request是被禁用还是启用只是log4j2的情景之一。

log4j2还允许将logging request中log信息打印到不同的目的地中。

在log4j2的世界里,不同的输出位置被称为Appender。

目前,Appender可以是console、文件、远程socket服务器、Apache Flume、JMS以及远程UNIX系统日志守护进程,数据库。

一个Logger可以绑定多个不同的Appender。

可以通过调用当前Configuration的addLoggerAppender方法为Logger增加一个Appender。

如果不存在一个与Logger名称相对应的LoggerConfig,那么相应的LoggerConfig将被创建,并且新增加的Appender将被添加到此新建的LoggerConfig中。

相关文档
最新文档