log4j2的简单学习:
package com.book.web.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; //import org.apache.commons.logging.Log; //import org.apache.commons.logging.LogFactory; //import org.apache.logging.log4j.LogManager; //import org.apache.logging.log4j.Logger; /** * log4j2测试 * @author liweihan * */ public class TestLog4j2Log { /** 1.org.apache.logging.log4j log4j-api 2.5 如果是web环境可以加入:因为会提示: Log4j appears to be running in a Servlet environment, but there's no log4j-web module available. If you want better web container support, please add the log4j-web JAR to your web archive or server lib directory. org.apache.logging.log4j log4j-core 2.5 2. log4j2与log4j1发生了很大的变化,不兼容。 log4j1仅仅作为一个实际的日志框架, slf4j、commons-logging作为门面,统一各种日志框架的混乱格局, 现在log4j2也想跳出来充当门面了,也想统一大家了!! 3.log4j2分成2个部分: log4j-api: 作为日志接口层,用于统一底层日志系统 log4j-core : 作为上述日志接口的实现,是一个实际的日志框架 4.log4j 2.x版本不再支持像1.x中的.properties后缀的文件配置方式, 2.x版本配置文件后缀名只能为”.xml”,”.json”或者”.jsn”。 log4j2默认会在classpath目录下寻找: <1.>log4j2-test.json 或者log4j2-test.jsn的文件 <2.>log4j2-test.xml的文件. <3.>log4j2.json 或者log4j2.jsn的文件. <4.>log4j2.xml的文件. 如果都没有找到,则会按默认配置输出,也就是输出到控制台 5.和log4j1是不同的。此时Logger是log4j-api中定义的接口,而log4j1中的Logger则是类 6.如果要log4j2与commons-logging集成,还需要引入jar包: org.apache.logging.log4j log4j-web 2.2 commons-logging commons-logging 1.2 commons-logging log4j-api (log4j2的API包) log4j-core (log4j2的API实现包) log4j-jcl (log4j2与commons-logging的集成包) private static Log logger = LogFactory.getLog(TestLog4j2Log.class); 使用commons-logging的Log接口和LogFactory来进行编写,看不到log4j2的影子。 但是这时候含有上述几个jar包,log4j2就与commons-logging集成了起来。 common-logging貌似不支持占位符! 7.如果log4j2与slf4j集成,还需要引入jar包: org.apache.logging.log4j log4j-jcl 2.2 org.slf4j slf4j-api 1.7.7 log4j-slf4j-impl : 用于log4j2与slf4j集成 获取logger的方式: private static Logger logger=LoggerFactory.getLogger(Log4j2Slf4jTest.class); */ // private static final Logger logger = LogManager.getLogger(TestLog4j2Log.class); // private static Log logger = LogFactory.getLog(TestLog4j2Log.class); private static Logger logger = LoggerFactory.getLogger(TestLog4j2Log.class); public static void main(String[] args) { if (logger.isTraceEnabled()) { logger.trace(" ===== log4j2 trace meassge"); } if (logger.isDebugEnabled()) { logger.debug(" ===== log4j2 debug message"); logger.debug(" ------ test log4j2:{},{}","Hello ","HANCHo"); } if (logger.isInfoEnabled()) { logger.info(" ===== log4j2 info message"); } if (logger.isErrorEnabled()) { logger.error(" ===== log4j2 error message "); } // Object[] params = {"HAN",1,"CHAO"}; logger.info(" ===== test:{}, 加班 {} 天, {}要回家了!",params); } } org.apache.logging.log4j log4j-slf4j-impl 2.5
配置文件:log4j2.xml
%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n
===============================================================================
一、Configuration
有两个属性:status和monitorinterval,有两个子节点:Appenders和Loggers(表明可以定义多个Appender和Logger).
status : 用来指定log4j本身的打印日志的级别.
monitorinterval : 用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s.
二、Appenders节点
常见的有三种子节点:Console、RollingFile、File.
1.Console: Console节点用来定义输出到控制台的Appender.
name:指定Appender的名字.
target:SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认:SYSTEM_OUT.
PatternLayout:输出格式,不设置默认为:%m%n.
2.File: File节点用来定义输出到指定位置的文件的Appender.
name:指定Appender的名字.
fileName:指定输出日志的目的文件带全路径的文件名.
PatternLayout:输出格式,不设置默认为:%m%n.
3.RollingFile: RollingFile节点用来定义超过指定大小自动删除旧的创建新的的Appender.
name:指定Appender的名字.
fileName:指定输出日志的目的文件带全路径的文件名.
PatternLayout:输出格式,不设置默认为:%m%n.
filePattern:指定新建日志文件的名称格式.
Policies:指定滚动日志的策略,就是什么时候进行新建日志文件输出日志.
TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am…而不是7am.
SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小.
DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max)
三、Loggers节点
常见子节点的有两种:Root和Logger.
1.Root:
Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出
level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
AppenderRef:Root的子节点,用来指定该日志输出到哪个Appender.
2.Logger:
Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。
level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点.
AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity=”false”只在自定义的Appender中进行输出。
四、关于日志level
共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
All:最低等级的,用于打开所有日志记录.
Trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出.
Debug:指出细粒度信息事件对调试应用程序是非常有帮助的.
Info:消息在粗粒度级别上突出强调应用程序的运行过程.
Warn:输出警告及warn以下级别的日志.
Error:输出错误信息日志.
Fatal:输出每个严重的错误事件将会导致应用程序的退出的日志.
OFF:最高等级的,用于关闭所有日志记录.
程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少
五、参考
log4j2:
http://blog.csdn.net/vergilgeekopen/article/details/61417342
http://www.cnblogs.com/hanfight/p/5721855.html
性能对比:
https://my.oschina.net/OutOfMemory/blog/789267
http://blog.csdn.net/yjh1271845364/article/details/70888262
其他日志系统了解:
http://blog.csdn.net/xudan1010/article/details/52890102
http://www.cnblogs.com/Leo_wl/p/3417215.html
https://my.oschina.net/pingpangkuangmo/blog/406618
六、遇到的一个问题
日志突然不打印了。查看日志,发现log4j2本身的日志显示:在加载log4j2.xml文件时发生错误。
log4j2使用自己默认的log4j2的配置,只能打印error日志。
默认配置:
分析原因: