slf4j-log4j

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

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

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

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

[b]Log4J的几个基本核心概念[/b]

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

[b]2、Appender [/b]
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(将日志信息以流格式发送到任意指定的地方)

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


[b]4、ConversionPattern[/b]
-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

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

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

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

[b]8、MDC 和 NDC[/b]
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


[b]8、maven 配置:[/b]

<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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值