slf4j教程

来源:互联网 发布:java调用exe程序 参数 编辑:程序博客网 时间:2024/05/22 03:35
slf4j只是一个门面(facet),它不包含具体的实现,而是将一些log4j,java.logging等实现包装成统一的接口。借用下图展示了常用日志文件的关系:



  通过上面的图,可以简单的理清关系!

  commons-logging和slf4j都是日志的接口,供用户使用,而没有提供实现!

  log4j,logback等等才是日志的真正实现。

  当我们调用接口时,接口的工厂会自动寻找恰当的实现,返回一个实现的实例给我服务。这些过程都是透明化的,用户不需要进行任何操作!

  这里有个小故事,当年Apache说服 log4j以及其他的日志来按照commons-logging的标准编写,但是由于commons-logging的类加载有点问题,实现起来也不友 好,因此log4j的作者就创作了slf4j,也因此而与commons-logging两分天下。至于到底使用哪个,由用户来决定吧。

  这样,slf4j出现了,它通过简单的实现就能找到符合自己接口的实现类,如果不是满足自己标准的日志,可以通过一些中间实现比如上面的slf4j-log4j12.jar来进行适配。

好,言归正传,如何使用slf4j?

一、使用slf4j快速入门

首先,项目中必须要包括slf4j-api.jar,此外,还应该包括slf4j为具体实现所提供的适配器(如slf4j-log4j12.jar),以及那个具体实现的jar包(如log4j-1.**.jar)。

我们以以下代码为例:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Slf4jDemo {
    private static final Logger LOG = LoggerFactory.getLogger(Slf4jDemo.class);

    public static void main(String[] args) {
        LOG.error("Error Message!");
        LOG.warn("Warn Message!");
        LOG.info("Info Message!");
        LOG.debug("Debug Message!");
        LOG.trace("Trace Message!");
    }
}
由于所使用的具体实现不同,日志输出也有不同的结果。这也反应了通过使用slf4j,使得可以方便的替换日志系统。

(一)Slf4j-simple

slf4j自带的一个简单实现,可用于小项目中,但无法配置日志级别等。

官方文档中的描述为:Binding for Simple implementation, which outputs all events to System.err. Only messages of level INFO and higher are printed. This binding may be useful in the context of small applications.

在项目的build_path中加入slf4j-1.6.6.jar与slf4j-simple-1.6.6.jar。

输出结果如下:

2 [main] ERROR Slf4jDemo - Error Message!
2 [main] WARN Slf4jDemo - Warn Message!
2 [main] INFO Slf4jDemo - Info Message!
(二)slf4j-jdk
使用jkd自带的日志系统,在项目的build_path中加入slf4j-1.6.6.jar与slf4j-jdk14-1.6.6.jar。
输出结果如下:
二月 16, 2015 11:09:36 下午 Slf4jDemo main
严重: Error Message!
二月 16, 2015 11:09:36 下午 Slf4jDemo main
警告: Warn Message!
二月 16, 2015 11:09:36 下午 Slf4jDemo main
信息: Info Message!

(三)slf4j-log4j
log4j是目前用得最多的日志系统,它更适用于大型项目。
在项目的build_path中加入slf4j-1.6.6.jar与slf4j-log4j-1.6.6.jar,以及log4j的具体实现,如log4j-1.2.16.jar。

输出结果如下:

log4j:WARN No appenders could be found for logger (Slf4jDemo).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
可以通过配置文件配置输出日志的级别。

二、一些注意事项

1、注意build_path中不能有多个日志实现,否则会导致slf4j不知道该使用哪个实现,从而出现以下错误

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/Users/liaoliuqing/99_Project/1_myCodes/5_JavaEEDemo/lib/slf4j-log4j12-1.6.6.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/liaoliuqing/99_Project/1_myCodes/5_JavaEEDemo/lib/slf4j-jdk14-1.6.6.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
log4j:WARN No appenders could be found for logger (Slf4jDemo).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

2、log4j的配置请见

一、日志输出级别、输出目标(appender)的定义

1、log4j.rootLogger=日志级别,appender1, appender2, ….
示例:log4j.rootLogger=INFO,stdout,DRFA
(1)设置整个工程的日志默认级别,以及日志的输出目标
(2)日志级别为ALL<DEBUG<INFO<WARN<ERROR<FATAL<OFF,不区分大小写。示例中的日志级别为INFO,即只有大于或者等于INFO的日志才会被记录。
(3)日志的输出目标有以下几类:
  • ConsoleAppender(控制台)
  • FileAppender(文件)
  • DailyRollingFileAppender(每天产生一个日志文件
  • RollingFileAppender(文件大小到达指定尺寸时产生一个新的文件)
  • WriteAppender(将日志信息以流格式发送到任意指定的地方)
  • JDBCAppender(将日志信息保存到数据库中)
示例中使用的是DailyRollingFileAppender。下一部分会详细介绍每个appender中的具体属性。


2、log4j.logger.org.mypackage[.MyClass]=日志级别,appender1, appender2, ….
示例:log4j.logger.org.apache.nutch.crawl.GeneratorJob=INFO,cmdstdout
(1)log4j.rootLogger 中的设置对整个工程生效,若只想对某个包或者某个类生效,可以使用本配置项。

3、log4j.threshold=ALL
In fact , threshold's level should be larger or equals rootlogger's level.
usually, thresold can be used to define some special appender's filter log level.
eg:
there are two appenders: console and file,and the level is warn, if you just only want the error message be written to file, so you can use "file.threshold=error" to filter out the "warn" message.

二、具体某个appender的设置
1、log4j.appender.appender1.File=文件目录及文件
2、log4j.appender.appender1.MaxFileSize=最大文件大小
3、log4j.appender.appender1.MaxBackupIndex=备份文件个数


   其中,appender1是在log4j.rootlogger或者具体包日志中定义过的;
    文件目录及文件,例如,/home/admin/logs/hutudan.log
    最大文件大小,例如,100KB
    备份文件个数,例如,1

4、log4j.appender.ServerDailyRollingFile.DatePattern=日志后缀格式

    例如,'.'yyyy-MM-dd

5、log4j.appender.appender1.layout=org.apache.log4j.日志布局格式

    HTMLLayout(以HTML表格形式布局)
    SimpleLayout(包含日志信息的级别和信息字符串)
    TTCCLayout(包含日志产生的时间,执行绪,类别等信息)
    PatternLayout(可以灵活的指定布局格式,常用)

6、log4j.appender.appender1.layout.ConversionPattern=日志输出格式

    例如,%d - %m%n或%d{yyyy-MM-dd HH:mm:ss} %p [%c] %m%n
    %c 输出日志信息所属的类的全名
    %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-M-dd HH:mm:ss },输出类似:2002-10-18- 22:10:28
    %f 输出日志信息所属的类的类名
    %l 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行
    %m 输出代码中指定的信息,如log(message)中的message
    %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
    %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推
    %r 输出自应用启动到输出该日志信息所耗费的毫秒数
    %t 输出产生该日志事件的线程名
    可参考:http://blog.sina.com.cn/s/blog_4e4dd5570100qowy.html

7、log4j.appender.ServerDailyRollingFile.Append=true

在后面追加


三、示例:Nutch中的log4j.properties


[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. # Define some default values that can be overridden by system properties  
  2. hadoop.log.dir=.  
  3. hadoop.log.file=hadoop.log  
  4.   
  5. # RootLogger - DailyRollingFileAppender  
  6. log4j.rootLogger=INFO,DRFA  
  7.   
  8. # Logging Threshold  
  9. log4j.threshold=ALL  
  10.   
  11. #special logging requirements for some commandline tools  
  12. log4j.logger.org.apache.nutch.crawl.Crawl=INFO,cmdstdout  
  13. log4j.logger.org.apache.nutch.crawl.InjectorJob=INFO,cmdstdout  
  14. log4j.logger.org.apache.nutch.host.HostInjectorJob=INFO,cmdstdout  
  15. log4j.logger.org.apache.nutch.crawl.GeneratorJob=INFO,cmdstdout  
  16. log4j.logger.org.apache.nutch.crawl.DbUpdaterJob=INFO,cmdstdout  
  17. log4j.logger.org.apache.nutch.host.HostDbUpdateJob=INFO,cmdstdout  
  18. log4j.logger.org.apache.nutch.fetcher.FetcherJob=INFO,cmdstdout  
  19. log4j.logger.org.apache.nutch.parse.ParserJob=INFO,cmdstdout  
  20. log4j.logger.org.apache.nutch.indexer.IndexingJob=INFO,cmdstdout  
  21. log4j.logger.org.apache.nutch.indexer.DeleteDuplicates=INFO,cmdstdout  
  22. log4j.logger.org.apache.nutch.indexer.CleaningJob=INFO,cmdstdout  
  23. log4j.logger.org.apache.nutch.crawl.WebTableReader=INFO,cmdstdout  
  24. log4j.logger.org.apache.nutch.host.HostDbReader=INFO,cmdstdout  
  25. log4j.logger.org.apache.nutch.parse.ParserChecker=INFO,cmdstdout  
  26. log4j.logger.org.apache.nutch.indexer.IndexingFiltersChecker=INFO,cmdstdout  
  27. log4j.logger.org.apache.nutch.plugin.PluginRepository=WARN  
  28. log4j.logger.org.apache.nutch.api.NutchServer=INFO,cmdstdout  
  29.   
  30. log4j.logger.org.apache.nutch=INFO  
  31. log4j.logger.org.apache.hadoop=WARN  
  32. log4j.logger.org.apache.zookeeper=WARN  
  33. log4j.logger.org.apache.gora=WARN  
  34.   
  35. #  
  36. # Daily Rolling File Appender  
  37. #  
  38.   
  39. log4j.appender.DRFA=org.apache.log4j.DailyRollingFileAppender  
  40. log4j.appender.DRFA.File=${hadoop.log.dir}/${hadoop.log.file}  
  41.   
  42. # Rollver at midnight  
  43. log4j.appender.DRFA.DatePattern=.yyyy-MM-dd  
  44.   
  45. # 30-day backup  
  46. #log4j.appender.DRFA.MaxBackupIndex=30  
  47. log4j.appender.DRFA.layout=org.apache.log4j.PatternLayout  
  48.   
  49. # Pattern format: Date LogLevel LoggerName LogMessage  
  50. log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} - %m%n  
  51. # Debugging Pattern format: Date LogLevel LoggerName (FileName:MethodName:LineNo) LogMessage  
  52. #log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n  
  53.   
  54.   
  55. #  
  56. # stdout  
  57. # Add *stdout* to rootlogger above if you want to use this   
  58. #  
  59.   
  60. log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
  61. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
  62. log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n  
  63.   
  64. #  
  65. # plain layout used for commandline tools to output to console  
  66. #  
  67. log4j.appender.cmdstdout=org.apache.log4j.ConsoleAppender  
  68. log4j.appender.cmdstdout.layout=org.apache.log4j.PatternLayout  
  69. log4j.appender.cmdstdout.layout.ConversionPattern=%m%n  


基本步骤如下:

1、指定log4j.rootLogger

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. log4j.rootLogger=INFO,DRFA  

【可选】为单独某个包或者类指定日志级别及appender

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #special logging requirements for some commandline tools  
  2. log4j.logger.org.apache.nutch.crawl.Crawl=INFO,cmdstdout  
  3. log4j.logger.org.apache.nutch.crawl.InjectorJob=INFO,cmdstdout  
  4. log4j.logger.org.apache.nutch.host.HostInjectorJob=INFO,cmdstdout  
  5. log4j.logger.org.apache.nutch.crawl.GeneratorJob=INFO,cmdstdout  
  6. log4j.logger.org.apache.nutch.crawl.DbUpdaterJob=INFO,cmdstdout  
  7. log4j.logger.org.apache.nutch.host.HostDbUpdateJob=INFO,cmdstdout  
  8. log4j.logger.org.apache.nutch.fetcher.FetcherJob=INFO,cmdstdout  
  9. log4j.logger.org.apache.nutch.parse.ParserJob=INFO,cmdstdout  
  10. log4j.logger.org.apache.nutch.indexer.IndexingJob=INFO,cmdstdout  
  11. log4j.logger.org.apache.nutch.indexer.DeleteDuplicates=INFO,cmdstdout  
  12. log4j.logger.org.apache.nutch.indexer.CleaningJob=INFO,cmdstdout  
  13. log4j.logger.org.apache.nutch.crawl.WebTableReader=INFO,cmdstdout  
  14. log4j.logger.org.apache.nutch.host.HostDbReader=INFO,cmdstdout  
  15. log4j.logger.org.apache.nutch.parse.ParserChecker=INFO,cmdstdout  
  16. log4j.logger.org.apache.nutch.indexer.IndexingFiltersChecker=INFO,cmdstdout  
  17. log4j.logger.org.apache.nutch.plugin.PluginRepository=WARN  
  18. log4j.logger.org.apache.nutch.api.NutchServer=INFO,cmdstdout  
  19.   
  20. log4j.logger.org.apache.nutch=INFO  
  21. log4j.logger.org.apache.hadoop=WARN  
  22. log4j.logger.org.apache.zookeeper=WARN  
  23. log4j.logger.org.apache.gora=WARN  
因此,nutch相关的包大多数日志均被重新指定了指向cmdstdout,而其它日志,如hadoop, zookeeper, gora只是重新定义了日志级别,而未重新定义appender,因此它们日志将被指向DRFA。

【可选】指定threshold

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. # Logging Threshold  
  2. log4j.threshold=ALL  

2、指定某个appender的属性

cmstd:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #  
  2. # plain layout used for commandline tools to output to console  
  3. #  
  4. log4j.appender.cmdstdout=org.apache.log4j.ConsoleAppender  
  5. log4j.appender.cmdstdout.layout=org.apache.log4j.PatternLayout  
  6. log4j.appender.cmdstdout.layout.ConversionPattern=%m%n  

%m 输出代码中指定的信息,如log(message)中的message
%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n

DRFA:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #  
  2. # Daily Rolling File Appender  
  3. #  
  4.   
  5. log4j.appender.DRFA=org.apache.log4j.DailyRollingFileAppender  
  6. log4j.appender.DRFA.File=${hadoop.log.dir}/${hadoop.log.file}  
  7.   
  8. # Rollver at midnight  
  9. log4j.appender.DRFA.DatePattern=.yyyy-MM-dd  
  10.   
  11. # 30-day backup  
  12. #log4j.appender.DRFA.MaxBackupIndex=30  
  13. log4j.appender.DRFA.layout=org.apache.log4j.PatternLayout  
  14.   
  15. # Pattern format: Date LogLevel LoggerName LogMessage  
  16. log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} - %m%n  
  17. # Debugging Pattern format: Date LogLevel LoggerName (FileName:MethodName:LineNo) LogMessage  
  18. #log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n  

输出文件可以用变量指定,如上面的:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. log4j.appender.DRFA.File=${hadoop.log.dir}/${hadoop.log.file}  

0 0