—-慢慢来比较快,虚心学技术—-
**

前言:Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

一、Log4j基本使用示例


  1. import org.apache.log4j.Level;
  2. import org.apache.log4j.Logger;
  3. public class Log4JTest {
  4. public static void main(String arg[]){
  5. //获取根logger
  6. Logger rootLogger = Logger.getRootLogger();
  7. //获取当前对象为名的logger
  8. Logger logger = Logger.getLogger(Log4JTest.class);
  9. rootLogger.info("root-info");
  10. logger.info("Log4j-INFO");
  11. logger.error("Log4j-ERROR");
  12. logger.debug("Log4j-DEBUG");
  13. rootLogger.debug("root-debug");
  14. logger.warn("Log4j-WARN");
  15. }
  16. }

log4j.properties(与Log4JTest.java同级目录)

  1. #配置rootLogger
  2. log4j.rootLogger=info,appender1,logFile,appender2
  3. #配置第一个appender
  4. log4j.appender.appender1=org.apache.log4j.ConsoleAppender
  5. #指定该appender输出所有DEBUG以上的日志
  6. log4j.appender.appender1.Threshold=DEBUG
  7. #选择比较方便的的日志输出格式-包含日志产生的时间、线程、类别等等信息
  8. log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout
  9. #配置第二个appender
  10. log4j.appender.appender2=org.apache.log4j.ConsoleAppender
  11. #指定该appender输出所有WARN以上的日志
  12. log4j.appender.appender2.Threshold=WARN
  13. #指定该appender通过控制台的err输出日志
  14. log4j.appender.appender2.Target=System.err
  15. #配置该appender的输出格式
  16. log4j.appender.appender2.layout = org.apache.log4j.PatternLayout
  17. #其中 %d表示日志时间点的日期或时间,默认格式为 ISO8601,也可以在其后指定格,
  18. # %l表示输出日志事件的发生位置,包括类目名、发生的线程,以及行数。
  19. # %-5p 输出日志信息优先级,占5个字符
  20. # %m 输出代码中指定的消息,产生的日志具体信息
  21. # %n 输出一个回车换行符
  22. log4j.appender.appender2.layout.ConversionPattern =%d %l %-5p %m %n
  23. log4j.appender.appender2.ImmediateFlush = true
  24. #配置文件输出appender
  25. log4j.appender.logFile = org.apache.log4j.FileAppender
  26. #配置文件输出样式
  27. log4j.appender.logFile.layout = org.apache.log4j.PatternLayout
  28. log4j.appender.logFile.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n
  29. #指定仅记录ERROR以上级别的日志
  30. log4j.appender.logFile.Threshold = ERROR
  31. log4j.appender.logFile.ImmediateFlush = TRUE
  32. #指定将日志累加到日志文件末尾
  33. log4j.appender.logFile.Append = TRUE
  34. #指定日志文件
  35. log4j.appender.logFile.File = ./Log4J/log/log4j.log
  36. log4j.appender.logFile.Encoding = UTF-8
  1. 运行结果如下:
控制台输出:
[main] INFO root - root-info
[main] INFO Log4JTest - Log4j-INFO
[main] ERROR Log4JTest - Log4j-ERROR
2019-01-30 15:22:16,052 Log4JTest.main(Log4JTest.java:13) ERROR Log4j-ERROR 
[main] WARN Log4JTest - Log4j-WARN
2019-01-30 15:22:16,054 Log4JTest.main(Log4JTest.java:16) WARN  Log4j-WARN 
Process finished with exit code 0
log4j.log内容:
[ERROR][2019/01/30 15:22:1652 ][Log4JTest.main(Log4JTest.java:13)]
Log4j-ERROR

二、Log4j使用浅析

log4j类图分析

java日志篇(3)-Log4j(log for java) - 图1image.gif

1.Logger

日志写出器,供程序员输出日志信息 (可控制日志输出级别)
**

2.Appander

日志目的地,把格式化好的日志信息输出到指定的地方去(指定了日志将打印到控制台还是文件中)

ConsoleAppender ———————目的地为控制台的 Appender

FileAppender ——————————-目的地为文件的 Appender

RollingFileAppender ——————目的地为大小受限的文件的 Appender

3.Layout

日志格式化器,用来把程序的 logging request 格式化成字符串(控制日志信息的显示格式)
**

4.log4j.properties

log4j对于程序控制的配置文件,目前支持xml以及java的properties格式
**

5.log4j日志优先级

ALL < DEBUG < INFO <WARN < ERROR < FATAL < OFF
**

三、Log4j配置详解(使用properties方式)

            虽然我们可以像上一篇文章[java日志篇(2)-JUL(java.util.logging)](https://mp.csdn.net/postedit/86416501)一样在java程序代码中去控制log4j的日志级别和输出样式等参数,但是基于灵活性和可扩展性的需求,我们最好选择在配置文件中设置log4j的基本参数,下面我们了解一下log4j配置文件的基本内容

1.配置根Logger(上述实例中的rootLogger)

语法:log4j.rootLogger = level,appenderName1,appenderName2
    其中:_**level**表示日志优先级别,**appenderName1,appenderName2**表示配置的一个个appender的名称_<br />_<br />        示例:log4j.rootLogger=info,appender1,appender2
        **注:rootLogger是所有logger的超类,在配置文件中对rootLogger的所有属性设置,都会被系统内所有logger所默认继承(包括级别,appender等)**

2.配置日志信息输出目的地 Appender

语法:
log4j.appender.appender名 = Log4j 提供的 appender 类   
log4j.appender.appender名.属性名 = 属性值 
......
log4j.appender.appender名.属性名 = 属性值

其中,上一节中的log4j类图所示,log4j提供的appender类主要有以下用的比较多的几个:

org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件), org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

其中,对应主要几个appender的属性列表如下:

ConsoleAppender: Threshold=level 指定日志消息的输出最低层次 ImmediateFlush=true/false 所有的消息是否立即输出,默认true Target=System.err/System.out 指定输出到控制台的形式,默认System.out

FileAppender: Threshold=同上 ImmediateFlush=同上 File=mylog.txt 指定消息输出到 mylog.txt 文件。
Append=true/false 是否将内容添加到日志文件的末尾,默认为true,false代表覆盖日志文件原有内容

RollingFileAppender: Threshold=同上 ImmediateFlush=同上 File=同上
Append=同上 MaxFileSize=100KB: 在日志文件到达该大小时,将会自动滚动, 即将原来的内容移到 mylog.log.1 文件。后缀可以是 KB, MB 或者是 GB. MaxBackupIndex=2 指定可以产生的滚动文件的最大数

DailyRollingFileAppender : Threshold=同上 ImmediateFlush=同上 File=同上
Append=同上 DatePattern=’’.’’yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。 当然也可以指定按月、周、天、时和分。即对应的格式如下: 1)’’.’’yyyy-MM: 每月 2)’’.’’yyyy-ww: 每周 3)’’.’’yyyy-MM-dd: 每天 4)’’.’’yyyy-MM-dd-a: 每天两次 5)’’.’’yyyy-MM-dd-HH: 每小时 6)’’.’’yyyy-MM-dd-HH-mm: 每分钟

3.配置日志信息的格式(布局)

语法:
log4j.appender.appender名.layout = Log4j 提供的 layout类
log4j.appender.appender名.layout.属性 = 值 
。。。。。。。。
log4j.appender.appender名.layout.属性 = 值

其中,log4j提供的layout类主要有以下几个:

org.apache.log4j.HTMLLayout(以 HTML 表格形式布局) org.apache.log4j.PatternLayout(可以灵活地指定布局模式) org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串) org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

通用属性

LocationInfo=true/false 是否输出 java 文件名称和行号,默认为false
PatternLayout:
ConversionPattern= %d %l %-5p %m %n 指定输出格式

-X 号: X 信息输出时左对齐; %p: 输出日志信息优先级,即 DEBUG,INFO,WARN,ERROR,FATAL,
%d: 输出日志时间点的日期或时间,默认格式为 ISO8601,也可以在其后指定格式, 比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002 年 10 月 18 日 22:10:28,921
%r: 输出自应用启动到输出该 log 信息耗费的毫秒数 %c: 输出日志信息所属的类目,配置文件中的名字,通常就是所在类的全名(若使用 rootLogger) %t: 输出产生该日志事件的线程名 %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及行数。 举例:Testlog4.main(TestLog4.java:10)
%x: 输出和当前线程相关联的 NDC(嵌套诊断环境),尤其用到像 java servlets 这样的多客户多线程的应 用中。
%%: 输出一个”%”字符
%F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,Windows 平台为”\r\n”,Unix 平台为”\n”输出日志信息换行 %M: 输出日志信息所属的方法

所遇问题:

如上述实例中配置,我们得到的输出里面都没有debug日志的内容

java日志篇(3)-Log4j(log for java) - 图3

 <br />        查看了日志文件,虽然我把某些appender级别设置为debug级别,依旧没有输出

java日志篇(3)-Log4j(log for java) - 图4

后经查看原来是因为设置了rootLogger的最低级别为info,其下子logger无法越级输出

java日志篇(3)-Log4j(log for java) - 图5

解决方案:
**
1.更改实时logger的级别:

logger.setLevel(Level.DEBUG);
        2.更改rootLogger的最低级别
log4j.rootLogger=all,appender1,logFile,appender2

总结

  1.通过配置文件log4j.properties或者log4j.xml对程序日志进行控制的方式比JUL更为方便灵活

  2.可以通过设置不同的appender和级别控制哪个级别的日志输出到何处,大大增强了日志管理的针对性<br />     <br />_ 注:本文参考文档:log4j 入门、详解 -雪飘零,纯属笔记,多多担待_<br />_<br />_**如有贻误,还请评论指正**