z_xiaozhuT的博客

个人博客

关于log4j的相关组件介绍

Log4J的三个组件:

Logger:日志记录器,负责收集处理日志记录     (如何处理日志)

Appender:日志输出目的地,负责日志的输出  (输出到什么 地方)

Layout:日志格式化,负责对输出的日志格式化(以什么形式展现)

类结构图

一个logger可以对应多个appender,一个appender只能对应一个layout。

1、Logger:

logger可以有选择的启动和禁用日志的输出,我们经常会在各种框架中看到如:

  1. private static final Logger log = LoggerFactory.getLogger(XX.class);  

 log就代表了一个Logger实例,他的name就是类“XX”的full quailied name(类的全限定名),按照上图所述,这个log就可以指定多个appender和layout。Logger的名字大小写敏感,其命名有继承机制:例如:name为org.apache.commons的logger会继承name为org.apache的logger。

Log4J中有一个特殊的logger叫做“root”,他是所有logger的根,也就意味着其他所有的logger都会直接或者间接地继承自root。root logger可以用Logger.getRootLogger()方法获取,但是不能通过Logger.getLogger("root")获得。可以代码测试验证:

  1. Logger root = Logger.getRootLogger();  
  2. Logger log  = Logger.getLogger("root");  
  3. System.out.println(log==root); //false  说明root无法通过name获取  

  4. Logger log2 = Logger.getLogger("root");  
  5. System.out.println(log==log2); //true,说明一个name唯一对应一个logger  

2、Level

level为logger服务,用来定义日志的级别,他的值可以是: OFF(关闭)FATAL(致命的) ERROR(错误)WARN(警告) INFO(信息)DEBUG (调试) ALL(所有),输出日志的策略由此Level决定,例如:如果logger的Level设置为INFO,那么系统只输出INFO以及以上(WARN、ERROR、FATAL)信息。如果当前logger没有设定Level,那么它在输出日志时采用的策略是:它会使用它继承的Logger的Level作为它自己的Level来处理。如果它的上级也没有设置Level,那么就找上上级,几次类推,直到root为止,(root的Level是不能设为空的,所以最终一定会找到一个Level)。默认root的Level是INFO,其他logger的Level默认都是null,需要手动指定。

Level对应的logger输出级别对应的方法有:

  1. logger.debug(message);   Log4J:Log4J三大组件:Logger+Appender+Layout 格式化编程详解
  2. logger.info(message);  
  3. logger.warn(message);  
  4. logger.error(message);  
  5. logger.fatal(message);  

3、Appender:

Appender可以控制日志的输出的目的地,一个输出源就叫一个Appender,appender的类别有:Console(控制台)File(文件)JDBC、JMS等等,logger可以通过方法logger.addAppender(appender);配置多个appender,对logger来说,每个有效的日志请求结果都将输出到logger本身以及父logger的appender上。例如:

  1.               Logger com = Logger.getLogger("com");  
  2. Appender appender = new FileAppender(new SimpleLayout(),"hello.log");  
  3. com.addAppender( appender);  

  4. Logger iteye = Logger.getLogger("com.iteye");  
  5. iteye.addAppender(new ConsoleAppender(new SimpleLayout(), "System.out"));  //target:sys.out(default) 或 sys.err  
  6. iteye.info("hello world");  

上例中,“iteye”是继承“com ”logger的,"com"定义的appender是FileAppender,而"iteye"定义的appender是ConsoleAppender,这里我并没有设置他们的Level,那么自动使用root默认的INFO作为日志的的等级,因此此处iteye.info(“hello world")会被输出到指定的appender上。注意:这里"iteye" 并没有设置FileAppender作为自己的appender,但是最终日志信息会显示在控制台,而且也会输出到文件hello.log中去。不过这里可以通过设置logger ”iteye"的additivity(附加标记)设为false ==》iteye.setAdditivity(false);这样日志信息“hello world”就不会写入到hello.log中去了。

常用的集中appender有:

org.apache.log4j.ConsoleAppender(控制台)

org.apache.log4j.FileAppender(文件)

org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)

org.apache.log4j.RollingFileAppender((文件大小到达指定尺寸的时候产生一个新的文件)

org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

4、Layout:

使用指定的Layout来展示(格式化)日志,常见的Layout有:

org.apache.log4j.HTMLLayout(以HTML表格形式布局)

org.apache.log4j.PatternLayout(可以灵活地指定布局模式)

org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)

org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息),更多

 

5、配置:

理解了以上几个组建后,我们就可以了解一下log4j的配置log4j.properties了。

  1.  #配置根Logger  
  2. log4j.rootLogger  =   [ level ]   ,  appenderName1 ,  appenderName2 ,  …  
  3.   
  4. #例子:  
  5. log4j.rootLogger = DEBUG ,  stdout ,file  
  6. #配置日志信息输出目的地(Appender)  
  7.       log4j.appender.appenderName  =  fully.qualified.name.of.appender.class   
  8.   log4j.appender.appenderName.option1  =  value1   
  9.   …   
  10.   log4j.appender.appenderName.optionN  =  valueN   
  11.   
  12. #例子  
  13. ### 输出到控制台 ###  
  14. log4j.appender.stdout = org.apache.log4j.ConsoleAppender  
  15. log4j.appender.stdout.Target = System.out   #默认就是System.out,另外一个值是System.error  
  16. log4j.appender.stdout.layout = org.apache.log4j.PatternLayout  
  17. log4j.appender.stdout.layout.ConversionPattern =  %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n  
  18.   
  19. ### 输出到文件 ###  
  20. log4j.appender.file = org.apache.log4j.DailyRollingFileAppender  
  21. log4j.appender.file.File = logs/log.log  
  22. log4j.appender.file.Append = true   #默认就是true,系统启动时追加至文件中,否则会覆盖原有内容  
  23. log4j.appender.file.Threshold = INFO ## 输出IFNO级别以上的日志,这里的意思是rootLogger设置为DEBUG时,只输出INFO以上(INFO、WARN、ERROR、FATAL)的信息到文件中去,而DEBUG信息就不会输出了  
  24. log4j.appender.file.layout = org.apache.log4j.PatternLayout  
  25. log4j.appender.file.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n  
  26. #配置日志信息的格式(Layout)  
  27. log4j.appender.appenderName.layout  =  fully.qualified.name.of.layout.class   
  28. log4j.appender.appenderName.layout.option1  =  value1   
  29. …   
  30. log4j.appender.appenderName.layout.optionN  =  valueN   
  31.   
  32. #例子  
  33. log4j.appender.file.layout = org.apache.log4j.PatternLayout  
  34. log4j.appender.file.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n  
  35.   
  36. ConversionPattern参数的格式含义   
  37. 格式名   含义   
  38. %c         输出日志信息所属的类的全名   
  39. %d         输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss },输出类似:2002-10-18- 22:10:28   
  40. %f          输出日志信息所属的类的类名   
  41. %l          输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行   
  42. %m        输出代码中指定的信息,如log(message)中的message   
  43. %n         输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”   
  44. %p         输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推   
  45. %r          输出自应用启动到输出该日志信息所耗费的毫秒数   
  46. %t          输出产生该日志事件的线程名  

最后如果你看到此类错误应该有不再感到疑惑了吧:

  1. public static org.slf4j.Logger log = LoggerFactory.getLogger(Test.class);  
  2. log.error("erro");  

 log4j:WARN No appenders could be found for logger (Test).

 log4j:WARN Please initialize the log4j system properly

阅读更多
想对作者说点什么? 我来说一句

Hadoop各个组件大概介绍

2016年03月07日 837KB 下载

单片机世界的期刊文章。

2011年07月21日 235KB 下载

log4j所需的jar包

2016年07月06日 473KB 下载

log4j 使用教程

2010年06月08日 9KB 下载

log4j jar包

2018年04月25日 311KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭