??xml version="1.0" encoding="utf-8" standalone="yes"?>久久亚洲美女精品国产精品 ,国产成人高清亚洲,亚洲色大18成人网站WWW在线播放 亚洲色大成WWW亚洲女子 http://www.tkk7.com/xzclog/category/17325.htmlzh-cnFri, 23 May 2008 20:25:03 GMTFri, 23 May 2008 20:25:03 GMT60Log4j日志理pȝ单用说?http://www.tkk7.com/xzclog/archive/2008/05/21/201845.htmlxzcxzcWed, 21 May 2008 02:36:00 GMThttp://www.tkk7.com/xzclog/archive/2008/05/21/201845.htmlhttp://www.tkk7.com/xzclog/comments/201845.htmlhttp://www.tkk7.com/xzclog/archive/2008/05/21/201845.html#Feedback0http://www.tkk7.com/xzclog/comments/commentRss/201845.htmlhttp://www.tkk7.com/xzclog/services/trackbacks/201845.html1?Loggers

    Loggerslg在此pȝ中被分ؓ五个U别QDEBUG、INFO、WARN、ERROR和FATAL。这五个U别是有序的,DEBUG < INFO < WARN < ERROR < FATALQ明白这一点很重要Q这里Log4j有一个规则:假设LoggersU别为PQ如果在Loggers中发生了一个别Q比P高,则可以启动,否则屏蔽掉?/p>

JavaE序举例来说Q?/strong>

//建立Logger的一个实例,命名?#8220;com.foo”

Logger  logger = Logger.getLogger("com.foo");

//讄logger的别。通常不在E序中设|logger的别。一般在配置文g中设|?/p>

logger.setLevel(Level.INFO);

Logger barlogger = Logger.getLogger("com.foo.Bar");

//下面q个h可用Q因为WARN >= INFO

logger.warn("Low fuel level.");

//下面q个h不可用,因ؓDEBUG < INFO

logger.debug("Starting search for nearest gas station.");

//命名?#8220;com.foo.bar”的实例barlogger会承实?#8220;com.foo”的别。因此,下面q个h可用Q因为INFO >= INFO

barlogger.info("Located nearest gas station.");

//下面q个h不可用,因ؓDEBUG < INFO

barlogger.debug("Exiting gas station search"); 

q里“是否可用”的意思是能否输出Logger信息?/strong> 

    在对Logger实例q行命名Ӟ没有限制Q可以取L自己感兴的名字。一般情况下以类的所在位|来命名Logger实例Q这是目前来讲比较有效的Logger命名方式。这样可以得每个类建立自己的日志信息,便于理。比如:

static Logger logger = Logger.getLogger(ClientWithLog4j.class.getName());

2?Appenders

    用与用日志请求只是Log4j其中的一个小的地方QLog4j日志pȝ允许把日志输出到不同的地方,如控制台QConsoleQ、文ӞFilesQ、根据天数或者文件大生新的文件、以的形式发送到其它地方{等?/p>

其语法表CZؓQ?/p>

org.apache.log4j.ConsoleAppenderQ控制台Q,


org.apache.log4j.FileAppenderQ文ӞQ?br /> org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文ӞQorg.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生一个新的文ӞQ?br /> org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)

配置时用方式ؓQ?/p>

log4j.appender.appenderName = fully.qualified.name.of.appender.class

log4j.appender.appenderName.option1 = value1

log4j.appender.appenderName.option = valueN

q样׃ؓ日志的输出提供了相当大的便利?/p>

3?Layouts

    有时用户希望Ҏ自己的喜好格式化自己的日志输出。Log4j可以在Appenders的后面附加Layouts来完成这个功能。Layouts提供了四U日志输出样式,如根据HTML样式、自由指定样式、包含日志别与信息的样式和包含日志旉、线E、类别等信息的样式等{?/p>

其语法表CZؓQ?/p>

org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,
org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,
org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,
org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)

配置时用方式ؓQ?/p>

     log4j.appender.appenderName.layout =       fully.qualified.name.of.layout.class
     log4j.appender.appenderName.layout.option1 = value1
     …
     log4j.appender.appenderName.layout.option = valueN
 
    以上是从原理斚w说明Log4j的用方法,在具?span style="background-color: yellow">Java~程使用Log4j可以参照以下CZQ?br /> 1?建立Logger实例Q?br />     语法表示Qpublic static Logger getLogger( String name)
    实际使用Qstatic Logger logger = Logger.getLogger   (ServerWithLog4j.class.getName ()) ;
2?d配置文gQ?/strong>
    获得了Logger的实例之后,接下来将配置Log4j使用环境Q?br />     语法表示Q?br />     BasicConfigurator.configure()Q自动快速地使用~省Log4j环境?br />     PropertyConfigurator.configure(String configFilename)Q读取用Java的特性文件编写的配置文g?/span>
    DOMConfigurator.configure(String filename)Q读取XML形式的配|文件?br />     实际使用QPropertyConfigurator.configure("ServerWithLog4j.properties");
3?插入日志信息
    完成了以上连个步骤以后,下面可以按日志的不同别插入到你要记录日志的Q何地方了?br />     语法表示Q?br />     Logger.debug(Object message);
    Logger.info(Object message);
    Logger.warn(Object message);
    Logger.error(Object message);
    实际使用Qlogger.info("ServerSocket before accept: " + server);
 
    在实际编E时Q要使Log4j真正在系l中q行事先q要寚w|文件进行定义。定义步骤就是对Logger、Appender及Layout的分别用,具体如下Q?/span>
1?配置根LoggerQ其语法为:
    log4j.rootLogger = [ level ] , appenderName, appenderName, …
q里level指Logger的优先QappenderName是日志信息的输出圎ͼ可以同时指定多个输出地。如Qlog4j.rootLogger= INFO,A1,A2
2?配置日志信息输出目的?/strong>Q其语法为:
    log4j.appender.appenderName = fully.qualified.name.of.appender.class
    可以指定上面所qC个目的地中的一个?br /> 3?配置日志信息的格?/strong>Q其语法为:
    log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
    q里上面三个步骤是对前面Log4jlg说明的一个简化;下面l出一个具体配|例子,在程序中可以参照执行Q?br />     log4j.rootLogger=INFO,A1
    log4j.appender.A1=org.apache.log4j.ConsoleAppender
    log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    log4j.appender.A1.layout.ConversionPattern=
                                        %-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
    q里需要说明的是日志信息格式中几个符h代表的含义:
    QX? X信息输出时左寚wQ?br />     %p: 日志信息U别
    %d{}: 日志信息产生旉
    %c: 日志信息所在地Q类名)
    %m: 产生的日志具体信?br />     %n: 输出日志信息换行
 
Ҏ上面的日志格式,某一个程序的输出l果如下Q?/strong>
0    INFO  2003-06-13 13:23:46968 ClientWithLog4j Client socket: Socket[addr=localhost/127.0.0.1,port=8002,localport=2014]
16   DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server says: 'Java server with log4j, Fri Jun 13 13:23:46 CST 2003'
16   DEBUG 2003-06-13 13:23:46984 ClientWithLog4j GOOD
16   DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Command 'HELLO' not understood.'
16   DEBUG 2003-06-13 13:23:46984 ClientWithLog4j HELP
16   DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Vocabulary: HELP QUIT'
16   DEBUG 2003-06-13 13:23:46984 ClientWithLog4j QUIT



xzc 2008-05-21 10:36 发表评论
]]>
pȝ日志分类别输日志文g[Log4j应用]http://www.tkk7.com/xzclog/archive/2008/05/21/201844.htmlxzcxzcWed, 21 May 2008 02:35:00 GMThttp://www.tkk7.com/xzclog/archive/2008/05/21/201844.htmlhttp://www.tkk7.com/xzclog/comments/201844.htmlhttp://www.tkk7.com/xzclog/archive/2008/05/21/201844.html#Feedback0http://www.tkk7.com/xzclog/comments/commentRss/201844.htmlhttp://www.tkk7.com/xzclog/services/trackbacks/201844.html目的开发过E中Q系l对日志的要求很l,而且要求分类清楚。所以还是采用了Log4J?br />
      在强调可重用lg开发的今天Q除了自׃头到ּ发一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包-Log4j?br />
      Log4j是Apache的一个开放源代码目Q通过使用Log4jQ我们可以控制日志信息输送的目的地是控制台、文件、GUIlg、甚x套接口服务器、NT的事件记录器、UNIX Syslog守护q程{;我们也可以控制每一条日志的输出格式Q通过定义每一条日志信息的U别Q我们能够更加细致地控制日志的生成过E。最令h感兴的是Q这些可以通过一个配|文件来灉|地进行配|,而不需要修改应用的代码?br />
      此外Q通过Log4j其他语言接口Q您可以在C、php、C++?Net、PL/SQLE序中用Log4jQ其语法和用法与在JavaE序中一P使得多语a分布式系l得C个统一一致的日志lg模块。而且Q通过使用各种W三Ҏ展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中?br />
      Log4j配置文g详细说明Q?.properties?.xmlQ?/strong>
      
属性文件Properties

properties属性文?

~号 配置?配置Ҏq?CZ
1 log4j.threshold 阈值项 log4j.threshold = error
2 log4j.rootLogger Ҏ志属性项 log4j.rootLogger = info,stdout1,stdout2
3 log4j.category. 子日志属性项Q旧Q?log4j.category.com.eos = NULL,stdout1
4 log4j.logger. 子日志属性项Q新Q?log4j.logger.com.eos.log = debug,stdout2
5 log4j.additivity. appender是否l承讄 log4j.additivity.com.eos = false
6 log4j.appender. 输出目的地定义项 log4j.appender.stdout2 = org.apache.log4j.ConsoleAppender
7 log4j.appender.A.layout 输出格式定义?log4j.appender.stdout2.layout = org.apache.log4j.PatternLayout

xml文g

~号 配置?配置Ҏq?CZ
1 threshold 阈值项
2 root Ҏ志属性项
    
    
  

3 priority U别(旧)
4 level U别(斎ͼ
5 category 子日志属性项Q旧Q?
6 logger 子日志属性项Q新Q?
7 appender-ref 输出端控刉
8 additivity appender是否l承讄
9 appender 输出目的地定义项
10 layout 输出格式定义?

详细说明Q只针对Log4j常用的,用户可以自定义)Appender
Appenderl承关系
Appender基本U类
org.apache.log4j.ConsoleAppenderQ控制台Q?br /> org.apache.log4j.FileAppenderQ文Ӟ
org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文Ӟ
org.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生一个新的文Ӟ
org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)
· ConsoleAppender选项
Threshold=WARN:指定日志消息的输出最低层ơ?br /> ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立卌出?br /> Target=System.errQ默认情况下是:System.out,指定输出控制?br /> · FileAppender 选项
Threshold=WARN:指定日志消息的输出最低层ơ?br /> ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立卌出?br /> File=mylog.txt:指定消息输出到mylog.txt文g?br /> Append=false:默认值是true,卛_消息增加到指定文件中Qfalse指将消息覆盖指定的文件内宏V?br /> · DailyRollingFileAppender 选项
Threshold=WARN:指定日志消息的输出最低层ơ?br /> ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立卌出?br /> File=mylog.txt:指定消息输出到mylog.txt文g?br /> Append=false:默认值是true,卛_消息增加到指定文件中Qfalse指将消息覆盖指定的文件内宏V?br /> DatePattern='.'yyyy-ww:每周滚动一ơ文Ӟx周生一个新的文件。当然也可以指定按月、周?br /> 天、时和分。即对应的格式如下:
1)'.'yyyy-MM: 每月
2)'.'yyyy-ww: 每周
3)'.'yyyy-MM-dd: 每天
4)'.'yyyy-MM-dd-a: 每天两次
5)'.'yyyy-MM-dd-HH: 每小?br /> 6)'.'yyyy-MM-dd-HH-mm: 每分?br /> n RollingFileAppender 选项
Threshold=WARN:指定日志消息的输出最低层ơ?br /> ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立卌出?br /> File=mylog.txt:指定消息输出到mylog.txt文g?br /> Append=false:默认值是true,卛_消息增加到指定文件中Qfalse指将消息覆盖指定的文件内宏V?br /> MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小Ӟ会自动滚动Q即原?br /> 的内容移到mylog.log.1文g?br /> MaxBackupIndex=2:指定可以产生的滚动文件的最大数?

详细说明Q只针对Log4jQ用户可以自定义QLayout
Log4j的Layout基本U类
org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,
org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,
org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,
org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)
· HTMLLayout选项
LocationInfo=true:默认值是false,输出java文g名称和行?br /> Title=my app file: 默认值是 Log4J Log Messages.      
n PatternLayout 选项
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
q里需要说明的是日志信息格式中几个符h代表的含义:

%X: 信息输出时左寚wQ?br /> %p: 输出日志信息优先U,即DEBUGQINFOQWARNQERRORQFATAL,
%d: 输出日志旉点的日期或时_默认格式为ISO8601Q也可以在其后指定格式,比如Q?d{yyy MMM dd HH:mm:ss,SSS}Q输出类|2002q?0?8?22Q?0Q?8Q?21
%r: 输出自应用启动到输出该log信息耗费的毫U数
%c: 输出日志信息所属的cȝQ通常是所在类的全?br /> %t: 输出产生该日志事件的U程?br /> %l: 输出日志事g的发生位|,相当?C.%M(%F:%L)的组?包括cȝ名、发生的U程Q以及在代码中的行数。D例:Testlog4.main(TestLog4.java:10)
%x: 输出和当前线E相兌的NDC(嵌套诊断环境),其用到像java servletsq样的多客户多线E的应用中?br /> %%: 输出一?%"字符
%F: 输出日志消息产生时所在的文g名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信?br /> %n: 输出一个回车换行符QWindowsq_?\r\n"QUnixq_?\n"输出日志信息换行Q可以在%与模式字W之间加上修饰符来控制其最宽度、最大宽度、和文本的对齐方式。如Q?br /> 1)%20cQ指定输出category的名Uͼ最的宽度?0Q如果category的名U小?0的话Q默认的情况下右寚w?br /> 2)%-20c:指定输出category的名Uͼ最的宽度?0Q如果category的名U小?0的话Q?-"h定左寚w?br /> 3)%.30c:指定输出category的名Uͼ最大的宽度?0Q如果category的名U大?0的话Q就会将左边多出的字W截掉,但小?0的话也不会有I格?br /> 4)%20.30c:如果category的名U小?0pI格Qƈ且右寚wQ如果其名称长于30字符Q?׃左边交远销出的字符截掉?br /> · XMLLayout 选项
LocationInfo=true:默认值是false,输出java文g和行?br />
日志配置文g内容范例  
log4j.properties

  1. log4j.rootLogger=DEBUG, CONSOLE    
  2. #DEBUG, CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE    
  3. #log4j.threshold=WARN
  4. log4j.logger.org.apache=INFO, FILE 
  5. log4j.additivity.org.apache=false    
  6.   
  7. ###################    
  8. # Console Appender    
  9. ###################    
  10. log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender    
  11. log4j.appender.Threshold=DEBUG    
  12. log4j.appender.CONSOLE.Target=System.out    
  13. log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout    
  14. log4j.appender.CONSOLE.layout.ConversionPattern=%d [%p] - %m%n    
  15.   
  16.   
  17. #####################    
  18. # File Appender    
  19. #####################    
  20. log4j.appender.FILE=org.apache.log4j.FileAppender    
  21. log4j.appender.FILE.File=file.log    
  22. log4j.appender.FILE.Append=false    
  23. log4j.appender.FILE.layout=org.apache.log4j.PatternLayout    
  24. log4j.appender.FILE.layout.ConversionPattern=%d [%p] - %m%n    
  25.   
  26.   
  27. ########################    
  28. # Rolling File    
  29. ########################    
  30. log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender    
  31. log4j.appender.ROLLING_FILE.Threshold=ERROR    
  32. log4j.appender.ROLLING_FILE.File=rolling.log    
  33. log4j.appender.ROLLING_FILE.Append=true    
  34. log4j.appender.ROLLING_FILE.MaxFileSize=10KB    
  35. log4j.appender.ROLLING_FILE.MaxBackupIndex=1    
  36. log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout    
  37. log4j.appender.ROLLING_FILE.layout.ConversionPattern=%d [%p] - %m%n    
  38.   
  39.   
  40. ####################    
  41. # Socket Appender    
  42. ####################    
  43. log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender    
  44. log4j.appender.SOCKET.RemoteHost=localhost    
  45. log4j.appender.SOCKET.Port=5001    
  46. log4j.appender.SOCKET.LocationInfo=true    
  47. # Set up for Log Facter 5    
  48. log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout    
  49. log4j.appender.SOCET.layout.ConversionPattern=%d [%p] - %m%n    
  50.   
  51.   
  52. ########################    
  53. # Log Factor 5 Appender    
  54. ########################    
  55. log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender    
  56. log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000    
  57.   
  58.   
  59. ########################    
  60. # SMTP Appender    
  61. #######################    
  62. log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender    
  63. log4j.appender.MAIL.Threshold=FATAL    
  64. log4j.appender.MAIL.BufferSize=10    
  65. log4j.appender.MAIL.From=wuyh@primeton.com    
  66. log4j.appender.MAIL.SMTPHost=mail.primeton.com    
  67. log4j.appender.MAIL.Subject=Log4J Message    
  68. log4j.appender.MAIL.To=test@primeton.com    
  69. log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout    
  70. log4j.appender.MAIL.layout.ConversionPattern=%d [%p] - %m%n    
  71.   
  72.   
  73. ########################    
  74. # JDBC Appender    
  75. #######################    
  76. log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender    
  77. log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test    
  78. log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver    
  79. log4j.appender.DATABASE.user=root    
  80. log4j.appender.DATABASE.password=    
  81. log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES (%d [%p] - %m%n)    
  82. log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout    
  83. log4j.appender.DATABASE.layout.ConversionPattern=%d [%p] - %m%n    
  84.   
  85.   
  86. log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender    
  87. log4j.appender.A1.File=SampleMessages.log4j    
  88. log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'    
  89. log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout    
  90.   
  91. ###################    
  92. #自定义Appender    
  93. ###################    
  94. log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender    
  95.   
  96. log4j.appender.im.host = mail.cybercorlin.net    
  97. log4j.appender.im.username = username    
  98. log4j.appender.im.password = password    
  99. log4j.appender.im.recipient = wuyh@primeton.com    
  100.   
  101. log4j.appender.im.layout=org.apache.log4j.PatternLayout    
  102. log4j.appender.im.layout.ConversionPattern =%d [%p] - %m%n   


#注意Q在属性配|文件中Q属性值的W一个一定是U别Q输出端可有可无Q以逗号分割。(而xml文g格式没有q种限制Q?br />
log4j.xml
  1. < xml version="1.0" encoding="UTF-8" >    
  2. <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">    
  3. <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false" threshold="null">    
  4.   
  5.   
  6. <appender class="org.apache.log4j.ConsoleAppender" name="CONSOLE">    
  7. <param name="Target" value="System.out"/>    
  8. <param name="Threshold" value="INFO"/>    
  9. <layout class="org.apache.log4j.PatternLayout">    
  10. <param name="ConversionPattern" value="%d [%p] - %m%n "/>    
  11. </layout>    
  12. <filter class="org.apache.log4j.varia.DenyAllFilter"/>    
  13. <errorHandler class="org.apache.log4j.varia. FallbackErrorHandler"/>    
  14. </appender>    
  15.   
  16. <appender class="org.apache.log4j.FileAppender" name="FILE">    
  17. <param name="File" value="file.log"/>    
  18. <param name="Append" value="false"/>    
  19. <param name="Threshold" value="INFO"/>    
  20. <layout class="org.apache.log4j.PatternLayout">    
  21. <param name="ConversionPattern" value="%d [%p] - %m%n "/>    
  22. </layout>    
  23. </appender>    
  24.   
  25. <appender class="org.apache.log4j.RollingFileAppender" name="ROLLING_FILE">    
  26. <param name="Threshold" value="INFO"/>    
  27. <param name="File" value="rolling.log"/>    
  28. <param name="Append" value="false"/>    
  29. <param name="MaxFileSize" value="10KB"/>    
  30. <param name="MaxBackupIndex" value="1"/>    
  31. <layout class="org.apache.log4j.PatternLayout">    
  32. <param name="ConversionPattern" value="%d [%p] - %m%n "/>    
  33. </layout>    
  34. </appender>    
  35.   
  36. <logger additivity="false" name="com.eos">    
  37. <level value="info"/>    
  38. <appender-ref ref="CONSOLE"/>    
  39. </logger>    
  40.   
  41. <category additivity="true" name="com.eos.log">    
  42. <priority value="warn"/>    
  43. </category>    
  44.   
  45. <root>    
  46. <priority value="info"/>    
  47. <appender-ref ref="CONSOLE"/>    
  48. </root>    
  49. </log4j:configuration>   



xzc 2008-05-21 10:35 发表评论
]]>
使用Log4jq行日志记录http://www.tkk7.com/xzclog/archive/2008/05/21/201839.htmlxzcxzcWed, 21 May 2008 02:20:00 GMThttp://www.tkk7.com/xzclog/archive/2008/05/21/201839.htmlhttp://www.tkk7.com/xzclog/comments/201839.htmlhttp://www.tkk7.com/xzclog/archive/2008/05/21/201839.html#Feedback0http://www.tkk7.com/xzclog/comments/commentRss/201839.htmlhttp://www.tkk7.com/xzclog/services/trackbacks/201839.htmlsolo L
发布日期Q?006q?7?0日,更新日期Q?006q?7?0?/div>
1996q初Q欧z安全电子市?EU SEMPER)目l决定编写自q日志记录APIQ后来这个API演变成了Log4j。Log4j是一个开放源码项目,一个非常流行的Java日志记录包。它允许开发者向代码中插入日志记录语句,q允许在不修改应用程序源码的情况下修改记录日志的行ؓ?/div>

1996q初Q欧z安全电子市?EU SEMPER)目l决定编写自q日志记录APIQ后来这个API演变成了Log4j。Log4j是一个开放源码项目,一个非常流行的Java日志记录包。它允许开发者向代码中插入日志记录语句,q允许在不修改应用程序源码的情况下修Ҏ志记录的行ؓ?/p>

几乎每一个项目都会用日志记录,但是׃日志记录不是目的核心,因此受重视的E度一般不是很高。我们认Z用日志记录是一仉怸肃的事情Q而且做好使用日志记录的规划比单纯记录日志本n更加重要?/p>

本文比较全面的阐述Log4j的设计原理和使用Ҏ?/p>

日志记录

日志记录记录的是应用E序q行的轨qV我们可以通过查看q些轨迹来调试应用程序,q可能也是日志记录最为流行的用法了。但是我们必L识到规划良好的日志记录中q含有丰富的信息Q通过手工的方式或借助一些工?大多数时候需要自己来书写q些工具)来分析挖掘这些信息?/p>

例如Q如果我们在规划中指出必记录用L每一ơ操作,记录的样式ؓ [日志信息]-[操作开始的旉]-[日志U别]-[日志cd]-[用户名]-[操作名]-[消息]Q这只是我们假设的一U样式,实际的日志中一般会含有比这更加丰富的信息。ؓ了更好的理解Q我们根据该样式构造了一些日志记?其中日志cdorg.solol.Main、org.solol.Parser和org.solol.UserOperator使用了不同的样式)Q?/p>

[日志信息]-[2006-07-30 08:54:20]-[INFO]-[org.solol.Main]-[具体的消息]
[日志信息]-[2006-07-30 08:55:20]-[INFO]-[org.solol.UserOperator]-[User1]-[查询报表1]-[具体的消息]
[日志信息]-[2006-07-30 08:55:30]-[INFO]-[org.solol.UserOperator]-[User1]-[查询报表2]-[具体的消息]
[日志信息]-[2006-07-30 08:56:01]-[INFO]-[org.solol.Parser]-[具体的消息]
[日志信息]-[2006-07-30 08:57:26]-[INFO]-[org.solol.UserOperator]-[User2]-[d用户User3]-[具体的消息]
[日志信息]-[2006-07-30 08:58:20]-[INFO]-[org.solol.UserOperator]-[User1]-[查询报表3]-[具体的消息]
[日志信息]-[2006-07-30 08:59:38]-[INFO]-[org.solol.UserOperator]-[User3]-[查询报表1]-[具体的消息]
[日志信息]-[2006-07-30 08:59:39]-[INFO]-[org.solol.UserOperator]-[User2]-[退出系l]-[具体的消息]

从上面的日志记录中我们很Ҏ抽取出某一用户的操作列表,如对于用户User1我们的结果ؓQ?/p>

[日志信息]-[2006-07-30 08:55:20]-[INFO]-[org.solol.UserOperator]-[User1]-[查询报表1]-[具体的消息]
[日志信息]-[2006-07-30 08:55:30]-[INFO]-[org.solol.UserOperator]-[User1]-[查询报表2]-[具体的消息]
[日志信息]-[2006-07-30 08:58:20]-[INFO]-[org.solol.UserOperator]-[User1]-[查询报表3]-[具体的消息]

q样我们得C某一旉D中User1的操作列表,可以利用q一列表来进行安全分析?/p>

我们q可以从另外的角度来分析上面的日志记录,如我们很Ҏl计出操?日志cd为org.solol.UserOperator)发生的L?6?Q其中操作[查询报表1]?ơ,[查询报表2]?ơ,[查询报表3]?ơ,[d用户User3]?ơ,[退出系l]?ơ。这h们就可以得出pȝ中的那些操作用户使用的比较频J?/p>

以上我们从两个角度对日记记录中的信息q行了简单的挖掘Q实际中待挖掘的斚w要丰富的多,q取决于您的意图和您的想象力?/p>

q里我们q要特别一下:所有这一切都需要有使用日志记录的良好规?/strong>。如果规划不?x志记录没有规律?Q那么我们挖掘时的Q务就会非常繁重或者挖掘成ؓ一个不可能的Q务?

文章Cq里我们要来描述日志记录的最为流行的用法了,卌试应用程序。我们在调试应用E序时一般会使用两种ҎQ除了日志记录之外,q有debugger调试器?/p>

我们不想把他们放Ch描述Q因是两个完全不同的问题Q虽然他们都用来调试应用E序。用debugger调试器我们可以清楚的知道引发错误的上下文及其相关信息Q也可以使用单步执行、设|断炏V检查变量以及暂挂和恢复U程{等比较高的能力,但是管q样它也不能替代日志记录Q同h志记录也不能替代debugger调试器。我们要l合使用q两U方法,不同的场景用不同的Ҏ会有更好的效果?/p>

我们认ؓ使用日志记录来调试应用程也应该充分考虑软g的开发周期。这里我们只考虑软g开发周期中的与日志记录有关的两个阶D:

  • 开发阶D,用来记录应用E序的方斚w面和各种l节Q非常详l,使得一看到它就知道那里Z问题Q出了什么样的问题?
  • 出品阶段Q要能够记录各种U别的错误和警告Q同时也要适度记录应用E序正常q行的关键信息,q些信息可以l相关h?开发h员、测试h员、用L)极大的信心,使他们可以毫不犹豫的告诉?-瞧我们的软g在正常的q行。如一个好的web服务器的启动日志记录不仅要包含错误和警告Q还要包含服务器正在启动Q正在加载某某组件等{,最后还要提C启动是成功q是p|?

阅读到这里我们就应该着手实现我们的日志记录了。比较幸q的是我们有好多日志记录软g包可选,q就使我们不必关心日志记录的l节Q只要把主要的精力放到日志记录的规划上就好了。我们选择的是Log4jQ文章的余下部分主要介l这个Java日志记录软g包?/p>

log4j的特?/a>

log4j的特性列表:

  • 在运行速度斚wq行了优?
  • 使用Z名称的日?logger)层次l构
  • 是fail-stop?
  • 是线E安全的
  • 不受限于预定义的实用工具?
  • 可以在运行时使用property和xml两种格式的文件来配置日志记录的行?
  • 在一开始就设计够处理Java异常
  • 能够定向输出到文?file)、控制台(console)、java.io.OutputStream、java.io.Writer、远E服务器、远EUnix Syslog守护者、远EJMS监听者、NT EventLog或者发送e-mail
  • 使用DEBUG、INFO、WARN、ERROR和FATAL?个?
  • 可以Ҏ的改变日志记录的布局(Layout)
  • 输出日志记录的目的地和写{略可以通过实现Appender接口来改?
  • 支持为每个日?logger)附加多个目的?appender)
  • 提供国际化支?
log4j的设计原?/a>

Log4j有三个主要的lgQLogger、Appender和Layout。这三个lg怺配合使得我们可以获得非常强大的日志记录的能力?/p>

Logger

Logger的名U是区分大小写的Q依据名U可以确定其层次l构(即父子关p?Q规则如下:

  • 如果Logger A的名U后跟一个点(.)是Logger B的名U的前缀p为Logger A是Logger B的祖先?
  • 如果在Logger A和Logger B之间QLogger B没有M其它的祖先就认ؓLogger A是Logger B的父二Ӏ?

在Logger的层ơ结构的最层是root loggerQ它会永q存在,而且不能通过名字取到?/p>

上面文字的描q可能不好的理解Qؓ此我们给Z一张图QLogger的层ơ结构图Q从中可以非常直观的看出三种主要lg的关pd各自所L作用?/p>

囄 1. Logger的层ơ结构图
Logger的层ơ结构图

 

Loger x.y是Logger x.y.z的祖先,因ؓx.y.是x.y.z的前~Q这W合规则的前一条。另外在Logger x.y和Logger x.y.z之间QLogger x.y.z没有其它的祖先,因此Logger x.y是Logger x.y.z的父Ԍq符合规则的后一条。这h们依据上面的规则可以构造出如图1所C的Logger的层ơ结构?/p>

从图1中我们还可以看到每一个Logger都有一个LevelQ根据该Level的值Logger军_是否处理对应的日志请求。如果Level没有被设|,p?中的Logger x.y一P又该怎么办呢Q答案是可以从祖先那里ѝ?/p>

如果Logger C没有被设|LevelQ那么它沿着它的层次l构向上查找,如果扑ֈq承ƈl束Q否则会一直查扑ֈroot loggerl束。因为log4j在设计时保证root logger会被讄一个默认的Level,所以Q何logger都可以承到Level?/p>

?中的Logger x.y没有被设|LevelQ但是根据上面的l承规则QLogger x.yl承了root logger的Level?/p>

我们在来看看Logger选择日志记录h(log request)的规则:

假设Logger MhqU的LevelQ这个Level可能是设|的也可能是l承到的?/p>

如果向Logger M发出一个Level为p的日志记录请求,那么只有满p>=q时这个日志记录请求才会被处理?/p>

org.apache.log4j.Logger中的不同Ҏ发出不同Level的日志记录请求,如下Q?/p>

  • public void debug(Object message)Q发出Level为DEBUG的日志记录请?
  • public void info(Object message)Q发出Level为INFO的日志记录请?
  • public void warn(Object message)Q发出Level为WARN的日志记录请?
  • public void error(Object message)Q发出Level为ERROR日志记录h
  • public void fatal(Object message)Q发出Level为FATAL的日志请?
  • public void log(Level l, Object message)Q发出指定Level的日志记录请?

其中的静态常量DEBUG、INFO、WARN、ERROR、FATAL是在org.apache.log4j.Level中定义的Q除了用这些预定义的Level之外QLog4jq支持自定义Level?/p>

注:org.apache.log4j.Level中还预定义了一些其它的Level?/p>

Appender

在Log4j中,Appender指的是日志记录输出的目的地。当前支持的Appender(目的?有文?file)、控制台(console)、java.io.OutputStream、java.io.Writer、远E服务器、远EUnix Syslog守护者、远EJMS监听者、NT EventLog或者发送e-mail。如果您在上面没有找到适合的AppenderQ那需要考虑实现自己的自定义Appender了?

每个Logger可以有多个AppenderQ但是相同的Appender只会被添加一ơ?/p>

Appender的附加性意味着Logger C会将日志记录发给它的和它先的所有Appender。在?中Logger a会将日志记录发给它自qJDBCAppender和它的祖先root logger的ConsoleAppender和FileAppender。Logger x.y.z自己没有AppenderQ它把日志记录发给它的先root logger的ConsoleAppender和FileAppenderQ如果Logger x.y也含有AppenderQ那么它们也会包括在内?

Appender的附加性是可以被中断的。假设Logger C的一个祖先ؓLogger PQ如果Logger P的附加性标?additivity flag)讄为假Q那么Logger C会将日志记录只发l它的和在它和Logger P之间的祖?包括Logger P)的AppenderQ而不会发lLogger P的祖先的Appender。Logger的附加性标?additivity flag)默认gؓture?

在图1中如果没有设|Logger a的附加性标?additivity flag)Q而是使用默认值trueQ那么Logger a会将日志记录发给它自qJDBCAppender和它先root logger的ConsoleAppender和FileAppenderQ这和上面的描述相同。如果设|Logger a的附加性标?additivity flag)的值falseQ那么Logger a会将日志记录发给它自qJDBCAppender而不会在发给它祖先root logger的ConsoleAppender和FileAppender了?

Layout

Appender定制了输出目的地Q通常我们q需要定制日志记录的输出格式,在Log4j中是通过Layout和Appender兌Ch实现的。Layout依据用户的要求来格式化日志记录。PatternLayout(标准Log4jlg)让用户依据类gC语言printf函数的{换模式来指定输出格式?

例如Q{换模?conversion pattern)?%r [%t] %-5p %c - %m%n"的PatternLayout生成类g以下内容的输出:

176 [main] INFO  org.foo.Bar - Located nearest gas station.

在上面的输出中:

  • W一个字D表CE序开始到发出日志记录h时所消耗的毫秒?
  • W二个字D表C发出日志记录请求的U程
  • W三个字D表C日志记录请求的Level
  • W四个字D表C发出日志记录请求的Logger的名U?
  • W五个字D?-后的文本)表示日志记录h的消?

Log4j中还提到了一些其它的LayoutQ包括HTMLLayout、SimpleLayout、XMLLayout、TTCCLayout和DateLayout。如果这些不能满x的要求,q可以自定义自己的Layout?/p>

log4j的配|?/a>

依据既有的经验显C用于日志记录的代码大约是全部代码量?%。如果应用程序具有一定的规模Q日志记录语句的数量q是比较巨大的,因此必须有效的管理这些语句?/p>

在Log4j中我们可以通过配置Log4j环境来有效的理日志记录。配|的方式有三U:

  • 通过E序配置
  • 通过Property文g配置
  • 通过XML文g配置

E序配置

通过E序配置Log4j环境实际上就是在应用E序的代码中改变Logger的Level或增加减Appender{等?/p>

Log4j提供了BasicConfiguratorQ它只是为root loggerdAppender。其中,

  • BasicConfigurator.configure()为root loggerd一个关联着PatternLayout.TTCC_CONVERSION_PATTERN的ConsoleAppender
  • BasicConfigurator.configure(Appender appender)为root loggerd指定的Appender

我们可以把BasicConfigurator看成是一个简单的使用E序配置Log4j环境的示例。例如,要给root loggerd两个Appender(A和B)Q下面的代码分别完成了这个要求?/p>

不用BasicConfiguratorQ?/p>

//CZ代码Q不能直接?
Logger root = Logger.getRootLogger();
root.addAppender(A);
root.addAppender(B);

使用BasicConfiguratorQ?/p>

//CZ代码Q不能直接?
BasicConfigurator.configure(A);
BasicConfigurator.configure(B);

Property文g配置

q里要用PropertyConfigurator来分析配|文件ƈ讄日志记录Q但是要注意日志记录先前的配|不会被清除和重设?

Property文g是由key=valueq样的键值对所l成的,可以使用#?作ؓ注释行的开始。下面给Z两个单的CZQ?/p>

非常单的CZ1Q?/p>

log4j.rootLogger=DEBUG, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n

E显复杂的示?Q?/p>

log4j.rootLogger=, A1, A2
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n
log4j.appender.A2=org.apache.log4j.FileAppender
log4j.appender.A2.File=filename.log
log4j.appender.A2.Append=false
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%-5r %-5p [%t] %c{2} - %m%n

上面的两个示例只是让您对配置文g的格式有一个大体的认识Q我们将在后面详l的描述各个配置元素的语法?/p>

Repository-wide thresholdQ?/p>

Repository-wide threshold指定的Level的优先高于Logger本n的Level。语法ؓlog4j.threshold=[level]Qlevel可以为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL。也可以使用自定义LevelQ这时的语法为log4j.threshold=[level#classname]。默认ؓALL?/p>

依据上面的规则,我们有这Ll论Q如果log4j.threshold=ERRORQLogger C的Level=DEBUGQ这时只有高于等于ERROR的日志记录请求会被Logger C处理?/p>

Appender的配|:

Appender的配|语法ؓ

# For appender named appenderName, set its class.
# Note: The appender name can contain dots.
log4j.appender.appenderName=fully.qualified.name.of.appender.class
# Set appender specific options.
log4j.appender.appenderName.option1=value1
...
log4j.appender.appenderName.optionN=valueN
#For each named appender you can configure its Layout.
#The syntax for configuring an appender's layout is:
log4j.appender.appenderName.layout=fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1=value1
....
log4j.appender.appenderName.layout.optionN=valueN

Logger的配|:

root logger的配|语法:

log4j.rootLogger=[level], appenderName, appenderName, ...Q其中level可以为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL。也可以使用自定义LevelQ这时的语法为[level#classname]?/p>

如果Level被指定那么root logger的Level被配置为指定倹{如果Level没有被指定那么root logger的Level不会被修攏V从上面的语法中我们可以看出通过?分隔的列表可以ؓroot logger指定多个Appender?/p>

对于root logger之外的logger语法是相似的Qؓlog4j.logger.logger_name=[level|INHERITED|NULL], appenderName, appenderName, ...

上面只有INHERITED和NULL需要说明一下,其它部分和root logger相同。INHERITED和NULL的意义是相同的。如果我们用了它们Q意味着q个logger不在用自qLevel而是从它的祖先那里ѝ?/p>

Logger的附加性标?additivity flag)可以使用log4j.additivity.logger_name=[false|true]来配|?/p>

ObjectRenderer配置Q?/p>

我们可以通过ObjectRenderer来定义将消息对象转换成字W串的方式。语法ؓlog4j.renderer.fully.qualified.name.of.rendered.class=fully.qualified.name.of.rendering.class。如Q?/p>

//my.Fruitcd的消息对象将由my.FruitRenderer转换成字W串
log4j.renderer.my.Fruit=my.FruitRenderer

对上面的各个配置元素的语法理解之后,在来看示??很Ҏ了?/p>

PropertyConfigurator不支持Filter的配|。如果要支持Filter您可以用DOMConfiguratorQ即使用XML文g的方式配|?/p>

XML文g配置

要用DOMConfigurator.configure()来读取XML格式的配|文件。XML文g格式的定义是通过org/apache/log4j/xml/log4j.dtd来完成的Q各个配|元素的嵌套关系如下Q?/p>

<!ELEMENT log4j:configuration (renderer*, appender*,(category|logger)*,root?,categoryFactory?)>

q里没有l出更ؓ详细的内容,要了解详l的内容需要查阅log4j.dtd?/p>

下面q个单的CZ可以使您对XML配置文g的格式有一个基本的认识Q?/p>

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j SYSTEM "log4j.dtd">
<log4j>
<appender name="A1" class="org.apache.log4j.FileAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %c{2} - %m\n"/>
</layout>
</appender>
<appender name="A2" class="org.apache.log4j.FileAppender">
<layout class="org.apache.log4j.TTCCLayout">
<param name="DateFormat" value="ISO8601" />
</layout>
<param name="File" value="warning.log" />
<param name="Append" value="false" />
</appender>
<category name="org.apache.log4j.xml" priority="debug">
<appender-ref ref="A1" />
</category>
<root priority="debug">
<appender-ref ref="A1" />
<appender-ref ref="A2" />
</root>
</log4j>
默认初始化过E?/a>

默认初始化过E在LogManagercȝ静态初始化器中完成。具体步骤如下:

  • 查系l属性log4j.defaultInitOverrideQ如果gؓfalse则执行初始化q程Q否则蟩q初始化q程?
  • 系l属性log4j.configuration的Dl变量resource。如果log4j.configuration没有被定义则使用默认值log4j.properties?
  • 试图转换变量resourceC个url?
  • 如果变量resource不能转换成一个urlQ那么将使用org.apache.log4j.helpers.Loader.getResource(resource, Logger.class)得到一个url?
  • 如果q是得不到urlQ将忽略默认初始化过E。如果得到url用PropertyConfigurator或DOMConfigurator来配|,也可以用自定义的XXXConfigurator?
solo L 一位有些理想主义的软g工程师,创徏?a >solol.org。他常常?a >q里发表一些对技术的见解?


xzc 2008-05-21 10:20 发表评论
]]>Commons 阅读W记 ?Logging ?/title><link>http://www.tkk7.com/xzclog/archive/2006/09/04/67482.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Sun, 03 Sep 2006 16:48:00 GMT</pubDate><guid>http://www.tkk7.com/xzclog/archive/2006/09/04/67482.html</guid><wfw:comment>http://www.tkk7.com/xzclog/comments/67482.html</wfw:comment><comments>http://www.tkk7.com/xzclog/archive/2006/09/04/67482.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/xzclog/comments/commentRss/67482.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/xzclog/services/trackbacks/67482.html</trackback:ping><description><![CDATA[ <div id="acwyaiw" class="center"> <h4>摘要:</h4>本文描述了apache commons中的commons loggings部分QCommons Logging和Log4J用来提供日志支持?<br /></div> <!-- end of summary line --> <div id="qwicmco" class="overflow" id="text"> <b>介绍</b> <br />命o行参数解析、应用程序配|和日志记录Q作Z个应用程序的骨架Q随处可见。因此,Apache软gl织开发出了一套通用的类库,用来帮助软g开发h员完成这些“骨架”的建立。其中:<br />&#8226;Commons CLI用于命o行解?br />&#8226;Commons Configuration用于dproperties格式或者XML格式的配|信?br />&#8226;Commons Logging和Log4J用来提供日志支持?br />q些通用的类库都在http://jakarta.apache.org/commons/index.html|址上提供下?br /><br />Apachel织开发了一套用于支持Logging的Log4JQJava 1.4版本也引入了一套内|的Logging框架Q如果开发者想在这两套Loggingpȝ之间自由的切换,该怎么办呢Q答案就是,使用Commons Logging。Commons Logging定义了一套抽象的Logging接口Q用户可以通过配置Qɘq些接口指向M一个已存在的Loggingpȝ?br /><br /><b>&#8226;使用抽象Logging接口</b><br />问题Q?br />你在~写一个可以重复用的库,需要写入Log信息Q但你不想你的Logging功能l定在Apache Log4J或者JDK 1.4 Logging框架上?br />解决ҎQ?br /><pre class="overflow"><br />public static void main(StringQ] args) {//自己替换Q]<br /><br />  System.setProperty("org.apache.commons.logging.Log",<br />      "org.apache.commons.logging.impl.Jdk14Logger");<br />  Log log = LogFactory.getLog("com.discursive.jccook.SomeApp");<br /><br />  if (log.isTraceEnabled()) {<br />    log.trace("This is a trace message");<br />  }<br /><br />  if (log.isDebugEnabled()) {<br />    log.debug("This is a debug message");<br />  }<br /><br />  log.info("This is an informational message");<br />  log.warn("This is a warning");<br />  log.error("This is an error");<br />  log.fatal("This is fatal");<br /><br />}<br /></pre><br />LogFactory.getLogҎ会根据底层环境返回一个适当的Log实现。如果用h指定一个具体的Loggingpȝ实现Q可以设|org.apache.commons.logging.Logpȝ属性。例如:<br />System.setProperty("org.apache.commons.logging.Log",<br />"org.apache.commons.logging.impl.Log4JLogger");<br />q样׃使用Log4J作ؓLoggingpȝ?br />org.apache.commons.logging.Log可以讑֮为:<br />&#8226;org.apache.commons.logging.impl.Log4JLogger  使用Log4J<br />&#8226;org.apache.commons.logging.impl.Jdk14Logger  使用JDK 1.4 Logging框架<br />&#8226;org.apache.commons.logging.impl.SimpleLog  使用Commons Logging内置的简单Log实现<br />其他Q?br />ȝ一下,Commons Logging会按照下列顺序来指定具体的Log实现?br />&#8226;如果定义了org.apache.commons.logging.Logpȝ参数Q实用指定的Logging实现?br />&#8226;如果在CLASSPATH里发CLog4JQ用Log4J?br />&#8226;如果使用的是JDK1.4Q用JDK1.4内置的Logging框架?br />&#8226;如果都没有找刎ͼ则用Commons Logging内置的简单Log实现?br /><br /><br /><a ><font color="#8d866d"><strong>Jakarta Commons Logging学习W记 转蝲</strong></font></a><font color="#8d866d"><strong><br /><br /></strong>1、Commons-Loggin?br /><br />  Jakarta Commons Logging (JCL)提供的是一个日?Log)接口(interface)Q同时兼轻量和不依赖于具体的日志实现工具?它提供给中间?日志工具开发者一个简单的日志操作抽象Q允许程序开发h员用不同的具体日志实现工具。用戯假定已熟悉某U日志实现工L更高U别的细节。JCL提供的接口,对其它一些日志工P包括Log4J, Avalon LogKit, and JDK 1.4{,q行了简单的包装Q此接口更接q于Log4J和LogKit的实? <br /><br />2、快速入?br /><br />  JCL有两个基本的抽象c:Log(基本记录?和LogFactory(负责创徏Log实例)。当commons-logging.jar被加入到CLASSPATH之后Q它会心可能合理地猜你喜欢的日志工P然后q行自我讄Q用h本不需要做M讄。默认的LogFactory是按照下列的步骤d现ƈ军_那个日志工具被使用的(按照序Q寻找过E会在找到第一个工h中止Q?<br /><br />L当前factory中名叫org.apache.commons.logging.Log配置属性的?br /><br />Lpȝ中属性中名叫org.apache.commons.logging.Log的?br /><br />如果应用E序的classpath中有log4j,则用相关的包装(wrapper)c?Log4JLogger)<br /><br />如果应用E序q行在jdk1.4的系l中Q用相关的包装c?Jdk14Logger)<br /><br />使用易日志包装类(SimpleLog)<br /><br /><br />3、开发用logging<br /><br /><br />//在程序文件头部import相关的类<br />import org.apache.commons.logging.Log;<br />import org.apache.commons.logging.LogFactory;<br />......<br />//在类中获取一个实?br />public class MYCLASS<br />{<br />private static Log log = LogFactory.getLog(MyCLASS.class);<br />...<br /> }<br /><br />日志信息被送往记录器,如上例中的log。这个发送过E,是通过调用Log接口中定义的Ҏ完成的,不同Ҏ跟不同的U别联系在一P日志信息通过哪个U别的方法发送,标明了日志信息的别。org.apache.commons.logging.Log接口中定义的Ҏ,按严重性由高到低的序有:<br /><br /><br />log.fatal(Object message); <br /><br />log.fatal(Object message, Throwable t);<br /><br />log.error(Object message); <br /><br />log.error(Object message, Throwable t);<br /><br />log.warn(Object message); <br /><br />log.warn(Object message, Throwable t); <br /><br />log.info(Object message); <br /><br />log.info(Object message, Throwable t); <br /><br />log.debug(Object message); <br /><br />log.debug(Object message, Throwable t);<br /><br />log.trace(Object message); <br /><br />log.trace(Object message, Throwable t);<br />除此以外Q还提供下列Ҏ以便代码保护.<br /><br />log.isFatalEnabled();<br /><br />log.isErrorEnabled();<br /><br />log.isWarnEnabled(); <br /><br />log.isInfoEnabled(); <br /><br />log.isDebugEnabled();<br /><br />log.isTraceEnabled();<br /><br />  信息U别<br />  保日志信息在内容上和反应问题的严重E度上的恰当Q是非常重要的?br /><br />fatal非常严重的错误,Dpȝ中止。期望这cM息能立即昄在状态控制台上?br /><br />error其它q行期错误或不是预期的条件。期望这cM息能立即昄在状态控制台上?br /><br />warn使用了不赞成使用的API、非常拙劣用API, '几乎是'错误, 其它q行时不合需要和不合预期的状态但q没必要UCؓ "错误"。期望这cM息能立即昄在状态控制台上?br /><br />infoq行时生的有意义的事g。期望这cM息能立即昄在状态控制台上?br /><br />debugpȝ程中的l节信息。期望这cM息仅被写入log文g中?br /><br />trace更加l节的信息。期望这cM息仅被写入log文g中?br /><br />通常情况下,记录器的U别不应低于info.也就是说Q通常情况下debug的信息不应被写入log文g中?br />  工作机理<br /><br />生命周期<br />JCL LogFactory必须实现建立/断开到日志工Lq接Q实例化/初始?解构一个日志工?<br /><br />异常处理<br />JCL Log 接口没有指定M异常处理,Ҏ口的实现必须捕获q处理异常?br /><br /><br />多线E?br />JCL Log ?LogFactory 的实玎ͼ必须保M日志工具对ƈ行的要求.<br /><br /><br />  记录器的讄<br />  JCL采用的记录器的不同其讄内容也不同。Log4J是默认首选记录器Q对其设|可通过pȝ属?system properties)或一个属性文件进行设|,下面是其讄参数?br /><table border="1"><tr><td>参数</td><td>值域</td><td>默认?lt;/td><td>说明</td></tr><tr><td>log4j.configuration</td><td></td><td>log4j.properties</td><td>指定配置文g的名?lt;/td></tr><tr><td>log4j.rootCategory</td><td>priority [, appender]*</td><td></td><td>讑֮根记录器的?lt;/td></tr><tr><td>log4j.logger&lt;.logger.name&gt;</td><td>DEBUG, INFO, WARN, ERROR, or FATAL</td><td>讑֮logger.nameq个记录器的U别</td></tr><tr><td>log4j.appender&lt;.appender&gt;.Threshold</td><td>priority</td><td>指定记录讑֤appender(console, files, sockets, and others)的最低别?lt;/td></tr></table><br /><!-- Added by RelatedTopic, plugin for Bo-Blog 2.0.0 --></font></div> <img src ="http://www.tkk7.com/xzclog/aggbug/67482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/xzclog/" target="_blank">xzc</a> 2006-09-04 00:48 <a href="http://www.tkk7.com/xzclog/archive/2006/09/04/67482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Log4j基本使用Ҏhttp://www.tkk7.com/xzclog/archive/2006/09/04/67481.htmlxzcxzcSun, 03 Sep 2006 16:42:00 GMThttp://www.tkk7.com/xzclog/archive/2006/09/04/67481.htmlhttp://www.tkk7.com/xzclog/comments/67481.htmlhttp://www.tkk7.com/xzclog/archive/2006/09/04/67481.html#Feedback3http://www.tkk7.com/xzclog/comments/commentRss/67481.htmlhttp://www.tkk7.com/xzclog/services/trackbacks/67481.html  一、定义配|文?/strong>

  其实您也可以完全不用配|文Ӟ而是在代码中配置Log4j环境。但是,使用配置文g您的应用E序更加灉|。Log4j支持两种配置文g格式Q一U是XML格式的文Ӟ一U是JavaҎ文Ӟ?|。下面我们介l用JavaҎ文件做为配|文件的ҎQ?/p>

  1.配置根LoggerQ其语法为:

  log4j.rootLogger = [ level ] , appenderName, appenderName, ?

  其中Qlevel 是日志记录的优先U,分ؓOFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的别。Log4j只用四个别,优先U从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的U别Q您可以控制到应用程序中相应U别的日志信息的开兟뀂比如在q里定义了INFOU别Q则应用E序中所有DEBUGU别的日志信息将不被打印出来?appenderName是指定日志信息输出到哪个地斏V您可以同时指定多个输出目的地?

  2.配置日志信息输出目的地AppenderQ其语法为:

  log4j.appender.appenderName = fully.qualified.name.of.appender.class
  log4j.appender.appenderName.option1 = value1
  ?
  log4j.appender.appenderName.option = valueN

  其中QLog4j提供的appender有以下几U:
  org.apache.log4j.ConsoleAppenderQ控制台Q,
  org.apache.log4j.FileAppenderQ文ӞQ?
  org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文ӞQ?br />  org.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生一个新的文ӞQ?
  org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)

  3.配置日志信息的格式(布局Q,其语法ؓQ?/p>

  log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
  log4j.appender.appenderName.layout.option1 = value1
  ?
  log4j.appender.appenderName.layout.option = valueN

  其中QLog4j提供的layout有以下几U:
  org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,
  org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,
  org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,
  org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)

Log4J采用cMC语言中的printf函数的打印格式格式化日志信息Q打印参数如下:
%m 输出代码中指定的消息
%n  输出一个回车换行符QWindowsq_为“\r\n”,Unixq_为“\n”?br />%p  输出优先U,即DEBUGQINFOQWARNQERRORQFATAL
%r   输出自应用启动到输出该log信息耗费的毫U数
%c  输出所属的cȝQ通常是所在类的全?
%t   输出产生该日志事件的U程?br />%d  输出日志旉点的日期或时_默认格式为ISO8601Q也可以在其后指定格式,
        比如Q?d{yyy MMM dd HH:mm:ss,SSS}Q输出类|2002q?0?8?22Q?0Q?8Q?21
%l   输出日志事g的发生位|,包括cȝ名、发生的U程Q以及在代码中的行数?br />        举例QTestlog4.main(TestLog4.java:10)
%F  cȝ?br />%L  代码中的行数

  二、在代码中用Log4j

  1.得到记录?/p>

  使用Log4jQ第一步就是获取日志记录器Q这个记录器负责控制日志信息。其语法为:

  public static Logger getLogger( String name)

  通过指定的名字获得记录器Q如果必要的话,则ؓq个名字创徏一个新的记录器。Name一般取本类的名字,比如Q?

  static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )

  2.d配置文g

  当获得了日志记录器之后,W二步将配置Log4j环境Q其语法为:

  BasicConfigurator.configure ()Q?自动快速地使用~省Log4j环境?br />  PropertyConfigurator.configure ( String configFilename) Q读取用Java的特性文件编写的配置文g?br />  DOMConfigurator.configure ( String filename ) Q读取XML形式的配|文件?/p>

  3.插入记录信息Q格式化日志信息Q?/p>

  当上两个必要步骤执行完毕Q您可以轻村֜使用不同优先U别的日志记录语句插入到您想记录日志的Q何地方,其语法如下:

  Logger.debug ( Object message ) ;
  Logger.info ( Object message ) ;
  Logger.warn ( Object message ) ;
  Logger.error ( Object message ) ;


介绍
命o行参数解析、应用程序配|和日志记录Q作Z个应用程序的骨架Q随处可见。因此,Apache软gl织开发出了一套通用的类库,用来帮助软g开发h员完成这些“骨架”的建立。其中:
&#8226;Commons CLI用于命o行解?br />&#8226;Commons Configuration用于dproperties格式或者XML格式的配|信?br />&#8226;Commons Logging和Log4J用来提供日志支持?br />q些通用的类库都在http://jakarta.apache.org/commons/index.html|址上提供下?br />
Log4J是一个高度可配置的Logging框架Q提供了l构化,多种目标和格式支持?br />
&#8226;配置Log4J
问题Q?br />Log4J支持Properties和XML两种格式的配|文件?br />解决ҎQ?br />定义log4j.properties配置文g

# 所有Log信息输出到标准输?System.out)和在下面指定的一个文?br /># WARN是默认的loggingU别
log4j.rootCategory = WARN, STDOUT, FILE

# 应用E序的loggingU别是DEBUG
log4j.logger.com.discursive = DEBUG

# 配置标准输出Appender
log4j.appender.STDOUT = org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout = org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern = %5p (%F:%L) %m%n

# 配置输出文gAppender
log4j.appender.FILE = org.apache.log4j.RollingFileAppender
log4j.appender.FILE.File = output.log
log4j.appender.FILE.MaxFileSize = 2000KB
log4j.appender.FILE.MaxBackupIndex = 5
log4j.appender.FILE.layout = org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern = %d %-5p %c - %m%n



PropertyConfigurator.configure(getClass()
  .getResource("/resources/log4j.properties"));

Logger logger = Logger.getLogger("com.discursive.SomeApp");
logger.info("This is a info message");
logger.error("This is a error message");


使用BasicConfiguratorcL加蝲log4j.properties配置。用Logger.getLogger获得一个logger实例?br />配置文g中的rootCategory指定log输出到控制台和output.log文g。文件Appender使用了RollingFileAppenderQ当文g大小辑ֈ最大文件大?MaxFileSize)2000KBӞRollingFileAppender会备份原log文gQƈ再创Z个新的log文g?br />配置文g指定默认的loggingU别是DEBUG(log4j.logger.com.discursive = DEBUG)。所以,所有别低于DEBUG的log信息都不会被输出。Log4J按重要度定义了五个logU别Q分别是QDEBUG, INFO, WARN, ERROR, 和FATAL?br />其他Q?br />Log4Jq可以用XML格式的配|文Ӟ使用DOMConfiguratord?br />Log4J使用Appender和Layout来定制log输出。Appender指定输出C处,Layout指定如何输出(输出的格??br />Log4J内置的Appender有:
&#8226;SMTPAppender
&#8226;RollingFileAppender
&#8226;SocketAppender
&#8226;SyslogAppender
&#8226;NTEventLogAppender
Log4J支持的Layout?br />&#8226;XMLLayout
&#8226;PatternLayout
&#8226;HTMLLayout
&#8226;DateLayout.


?
# 所有Log信息输出到标准输?System.out)和在下面指定的一个文?br /># WARN是默认的loggingU别
log4j.rootCategory = INFO, STDOUT
#log4j.rootCategory = INFO, STDOUT, FILE

# 配置标准输出Appender
log4j.appender.STDOUT = org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout = org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern = %d{ABSOLUTE} %-5p [%c:%L] %m%n

# 配置输出文gAppender
log4j.appender.FILE = org.apache.log4j.RollingFileAppender
log4j.appender.FILE.File = output.log
log4j.appender.FILE.MaxFileSize = 2000KB
log4j.appender.FILE.MaxBackupIndex = 5
log4j.appender.FILE.layout = org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern = %d %-5p [%c:%L] %m%n

# 应用E序的loggingU别是DEBUG
log4j.logger.com.xzc = DEBUG


?
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - <%m>%n

### direct messages to file hibernate.log ###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=warn, stdout

log4j.logger.net.sf.hibernate=warn

### log just the SQL
#log4j.logger.net.sf.hibernate.SQL=debug

### log JDBC bind parameters ###
log4j.logger.net.sf.hibernate.type=info

### log schema export/update ###
log4j.logger.net.sf.hibernate.tool.hbm2ddl=debug

### log cache activity ###
#log4j.logger.net.sf.hibernate.cache=debug

### enable the following line if you want to track down connection ###
### leakages when using DriverManagerConnectionProvider ###
#log4j.logger.net.sf.hibernate.connection.DriverManagerConnectionProvider=trace

?

log4j.rootLogger=debug, stdout, R

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log

log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n





?
# Log4j׃个重要的lg构成Q日志信息的优先U,日志信息的输出目的地Q日志信息的输出格式
# 1.配置根LoggerQ其语法为:
#  log4j.rootLogger = [ level ] , appenderName, appenderName, ?
# 2.配置日志信息输出目的地AppenderQ其语法为:
#  log4j.appender.appenderName = fully.qualified.name.of.appender.class
#  log4j.appender.appenderName.option1 = value1
#  ?
#  log4j.appender.appenderName.option = valueN
# Log4j提供的appender有以下几U:
# org.apache.log4j.ConsoleAppenderQ控制台Q,
# org.apache.log4j.FileAppenderQ文ӞQ?
# org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文ӞQ?br /># org.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生一个新的文ӞQ?
# org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)
# 3.配置日志信息的格式(布局Q,其语法ؓQ?br />#  log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class 
#  log4j.appender.appenderName.layout.option1 = value1
#  ?
#  log4j.appender.appenderName.layout.option = valueN
# Log4j提供的layout有以下几U:
# org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,
# org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,
# org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,
# org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)
# Log4J采用cMC语言中的printf函数的打印格式格式化日志信息Q打印参数如下:
# %m  输出代码中指定的消息
# %n  输出一个回车换行符QWindowsq_为“\r\n”,Unixq_为“\n?
# %p  输出优先U,即DEBUGQINFOQWARNQERRORQFATAL
# %r  输出自应用启动到输出该log信息耗费的毫U数
# %c  输出所属的cȝQ通常是所在类的全?
# %t  输出产生该日志事件的U程?br /># %d  输出日志旉点的日期或时_默认格式为ISO8601Q也可以在其后指定格式,
#     比如Q?d{yyy MMM dd HH:mm:ss,SSS}Q输出类|2002q?0?8?22Q?0Q?8Q?21
# %l  输出日志事g的发生位|,包括cȝ名、发生的U程Q以及在代码中的行数?br />#     举例QTestlog4.main(TestLog4.java:10)
# %F  cȝ?br /># %L  代码中的行数
# 所有Log信息输出到标准输?System.out)和在下面指定的一个文?
# 日志信息的优先从从高到低有ERROR、WARN、INFO、DEBUG
# WARN是默认的loggingU别
log4j.rootCategory = INFO, STDOUT
#log4j.rootCategory = INFO, STDOUT, FILE
#log4j.rootCategory = INFO, STD
 
# 配置标准输出Appender
log4j.appender.STDOUT = org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout = org.apache.log4j.PatternLayout
#log4j.appender.STDOUT.layout.ConversionPattern = %d{ABSOLUTE} %-5p [%c:%t:%L] %m%n
log4j.appender.STDOUT.layout.ConversionPattern = %d{ABSOLUTE} %-5p [ %l ] %m%n
# 配置输出文gAppender
log4j.appender.FILE = org.apache.log4j.RollingFileAppender
log4j.appender.FILE.File = output.log
log4j.appender.FILE.MaxFileSize = 2000KB
log4j.appender.FILE.MaxBackupIndex = 5
log4j.appender.FILE.layout = org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern = %d %-5p [%c:%L] %m%n
# 配置默认输出layout
log4j.appender.STD = org.apache.log4j.ConsoleAppender
log4j.appender.STD.layout = org.apache.log4j.TTCCLayout
# 应用E序的loggingU别是DEBUG
log4j.logger.com.xzc = DEBUG






xzc 2006-09-04 00:42 发表评论
]]>
վ֩ģ壺 þóѲ| ˳վ999þþۺ| Ʒ97˳Ƶ| ѹƵ| AVþWWW| ŮƵ| ҹƷһ鶹| ƻ԰Ѹ| Ļվ| ɫ߾Ʒѹۿ| AVƷһ| ĻѾþӰԺ| ߹ۿʮ | AVƬ߹ۿ| þþþרav| aٰƵ| þѾƷav| ѿƵ| ɫ18վWWW߲| һһëƬa| һؼŮ18ëƬƵ | ༤ۺ͵| jizzjizz߲| ޹ƷþþžŴƬ| av2018| 99ƵֻоƷ| ޾ƷþëƬҰ | ѹۿСˮ| ƷžƷƵ| AVһAS | һ| ޵һ| 츾ٸ߹ۿ| ߿վ| ޹Ʒþ98| ޳AVƬ߲| һ3Ŀ| պƷƵ߹ۿ| þþAVҰ| Ļ߾ƷƵѹۿ| ˾ƷѾþþþ|