`

slf4j-log4j

阅读更多
在几乎所有的业务系统中,日志是必不可少的组建,尤其是复杂的业务系统。
java业界有多种优秀log工具可供选择,log4j 和 logback 更是其中翘楚,本文要讲解的是log4j,即使logback更优秀,但是很多老的生产环境的系统,依然在使用log4j~

日志的目标:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作;跟踪代码运行时轨迹,作为日后审计的依据;担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息。
注意:即使有再好的log工具,也未必能真正的利用好,这更要看使用者对业务场景的熟悉,以记录有效的数据,曾看到在一些项目中,log随意打印了很多无效的数据,或者数据打印不是业务分析的全部数据,这样log打印几乎是没用。

简单说明:通常我们都提供一个名为 log4j.properties的文件,在第一次调用到Log4J时,Log4J会在类路径(../web-inf/class/当然也可以放到其它任何目录,只要该目录被包含到类路径中即可)中定位这个文件,并读入这个文件完成的配置。这个配置文件告诉Log4J以什么样的格式、把什么样的信息、输出到什么地方。

Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可接key=value格式的设置或xml格式的设置信息。通过配置,可以创建出Log4J的运行环境。

Log4J的几个基本核心概念

1、LEVEL日志输出级别:
FATAL       0 
ERROR      3 
WARN       4 
INFO         6 
DEBUG      7

2、Appender
Appender 为日志输出目的地,Log4j提供的appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台),
    Threshold=WARN:指定日志消息的输出最低层次。
    ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
    Target=System.err:默认情况下是:System.out,指定输出控制台

org.apache.log4j.FileAppender(文件)
    Threshold=WARN:指定日志消息的输出最低层次。
    ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
    File=mylog.txt:指定消息输出到mylog.txt文件。
    Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。

org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
    Threshold=WARN:指定日志消息的输出最低层次。
    ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
    File=mylog.txt:指定消息输出到mylog.txt文件。
    Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
    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: 每分钟
   
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
    Threshold=WARN:指定日志消息的输出最低层次。
    ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
    File=mylog.txt:指定消息输出到mylog.txt文件。
    Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
    MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
    MaxBackupIndex=2:指定可以产生的滚动文件的最大数。

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

3、Layout
日志输出格式,Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)


4、ConversionPattern
         -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: 输出日志信息所属的类目,通常就是所在类的全名
    %t: 输出产生该日志事件的线程名
    %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
    %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
    %%: 输出一个"%"字符
    %F: 输出日志消息产生时所在的文件名称
    %L: 输出代码中的行号
    %m: 输出代码中指定的消息,产生的日志具体信息
    %n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行
eg:log4j.appender.infoFile.layout.ConversionPattern = %d{MM-dd HH\:mm\:ss.SSS} %-5p [%F\:%L]%x %m%n

5、配置根rootLogger
其语法为:log4j.rootLogger = [ level ] , appenderName, appenderName, …
eg: log4j.rootLogger = INFO,debugFile,infoFile,errorFile,stdout
注意:INFO 此处的配置 为INFO ,即使其他 appender的Threshold的级别为DEBUG,也不会输出。

6、Threshold 自定义输出的日志级别
  此处配置的输出级别,一定要高于 根Logger 的配置的日志级别,否则无意义。当让除非你使用第七条规定,重新设定了log的输出级别

7、设置 特定包的级别和目的地
设置com.qunar.log4j包的级别为ERROR级别
log4j.logger.com.qunar.log4j=ERROR
特别注意:此处包级别的设置会覆盖rootLogger的级别设置
设置com.qunar.logback包的输出 到logback Appender
log4j.logger.com.qunar.logback=DEBUG,logback

8、MDC 和 NDC
NDC和MDC是log4j用于存储应用程序的上下文信息(context infomation),从而便于在log中使用这些上下文信息。
NDC采用了一个类似栈的机制来push存储上下文信息,每一个线程都独立地储存上下文信息。比如说一个servlet就可以针对每一个request创建对应的NDC,储存客户端地址等等信息。相关的信息使用NDC.push(message);
在log的时候将信息输出。在相应的PatternLayout中使用”%x”来输出存储的上下文信息

MDC:
MDC内部使用了类似map的机制来存储信息,相对应的方法,MDC.put(key,value);在配置PatternLayout的时候使用:%X{key}来输出对应的value
MDC.put("domain", "www.qunar.com");
LogDependencyApi.printLog("xinchun.wang login in~");

log4j.appender.logApi.layout.ConversionPattern = %d{MM-dd HH\:mm\:ss.SSS} %-5p [%F\:%L][%X{domain}]%x %m%n

输出:
07-20 12:00:19.270 ERROR [LogDependencyApi.java:17][www.qunar.com]ndc info 1 ndc info 3 hello xinchun.wang login in~


案例:
log4j.rootLogger = INFO,debugFile,infoFile,errorFile,stdout
#注意:INFO 此处的配置 为INFO ,即使其他 appender的Threshold的级别为DEBUG,也不会输出。
#rootLogger 拥有第一优先级

#此处包级别的设置会覆盖rootLogger的级别设置
#log4j.logger.com.qunar.log4j=DEBUG

#此处的配置,一般适用于引用的jar包,或者特定功能的逻辑,输出到某一个文件内
#log4j.logger.com.qunar.logback=DEBUG,logback

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %c:%L %p - %m%n

log4j.appender.debugFile          = org.apache.log4j.DailyRollingFileAppender
log4j.appender.debugFile.Threshold= DEBUG
log4j.appender.debugFile.Append   = true
log4j.appender.debugFile.File     =${catalina.base}/logs/debugFile.log
log4j.appender.debugFile.encoding = UTF-8
log4j.appender.debugFile.layout   = org.apache.log4j.PatternLayout
log4j.appender.debugFile.layout.ConversionPattern = %d{MM-dd HH\:mm\:ss.SSS} %-5p [%F\:%L]%x %m%n


log4j.appender.infoFile          = org.apache.log4j.DailyRollingFileAppender
log4j.appender.infoFile.Threshold= INFO
log4j.appender.infoFile.Append   = true
log4j.appender.infoFile.File     =${catalina.base}/logs/infoFile.log
log4j.appender.infoFile.encoding = UTF-8
log4j.appender.infoFile.layout   = org.apache.log4j.PatternLayout
log4j.appender.infoFile.layout.ConversionPattern = %d{MM-dd HH\:mm\:ss.SSS} %-5p [%F\:%L]%x %m%n



log4j.appender.errorFile          = org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorFile.Threshold= ERROR
log4j.appender.errorFile.Append   = true
log4j.appender.errorFile.File     =${catalina.base}/logs/errorFile.log
log4j.appender.errorFile.encoding = UTF-8
log4j.appender.errorFile.layout   = org.apache.log4j.PatternLayout
log4j.appender.errorFile.layout.ConversionPattern = %d{MM-dd HH\:mm\:ss.SSS} %-5p [%F\:%L]%x %m%n

log4j.appender.logback          = org.apache.log4j.DailyRollingFileAppender
log4j.appender.logback.Threshold= DEBUG
log4j.appender.logback.Append   = true
log4j.appender.logback.File     =${catalina.base}/logs/logback.log
log4j.appender.logback.encoding = UTF-8
log4j.appender.logback.layout   = org.apache.log4j.PatternLayout
log4j.appender.logback.layout.ConversionPattern = %d{MM-dd HH\:mm\:ss.SSS} %-5p [%F\:%L]%x %m%n


8、maven 配置:
<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.6.4</version>
		</dependency>

		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.6.4</version>
		</dependency>

		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics