Log4j回顾

Log4j是什么

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

log4j的级别(由大到小)

OFF (most specific)、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、ALL
说明: 日志级别如果为 info ,所有级别小于 info 的日志都不会被记录

配置文件详解

在CLASSPATH下建立log4j.properties(Java项目)

log4j.rootCategory=INFO, stdout , R

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n

log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=D:\Tomcat 5.5\logs\qc.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n

log4j.logger.com.neusoft=DEBUG
log4j.logger.com.opensymphony.oscache=ERROR
log4j.logger.net.sf.navigator=ERROR
log4j.logger.org.apache.commons=ERROR
log4j.logger.org.apache.struts=WARN
log4j.logger.org.displaytag=ERROR
log4j.logger.org.springframework=DEBUG
log4j.logger.com.ibatis.db=WARN
log4j.logger.org.apache.velocity=FATAL

log4j.logger.com.canoo.webtest=WARN

log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN
log4j.logger.org.hibernate=DEBUG
log4j.logger.org.logicalcobwebs=WARN

解释说明:

log4j.rootCategory=INFO, stdout , R

此句为将等级为INFO的日志信息输出到stdout和R这两个目的地,stdout和R的定义在下面的代码,可以任意起名。等级可分为OFF、 FATAL、ERROR、WARN、INFO、DEBUG、ALL,如果配置OFF则不打出任何信息,如果配置为INFO这样只显示INFO, WARN, ERROR的log信息,而DEBUG信息不会被显示,具体讲解可参照第三部分定义配置文件中的logger。

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

此句为定义名为stdout的输出端是哪种类型,可以是

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

具体讲解可参照第三部分定义配置文件中的Appender。

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

此句为定义名为stdout的输出端的layout是哪种类型,可以是

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

具体讲解可参照第三部分定义配置文件中的Layout。

log4j.appender.stdout.layout.ConversionPattern= [QC] %p [%t] %C.%M(%L) | %m%n

如果使用pattern布局就要指定的打印信息的具体格式ConversionPattern,打印参数如下:

%m 输出代码中指定的消息

%f 输出日志信息所属的类的类名

%p  输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r  输出自应用启动到输出该log信息耗费的毫秒数
%c  输出所属的类目,通常就是所在类的全名
%t  输出产生该日志事件的线程名
%n  输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
%d  输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921

%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。

注意大小写的区分

大写时(%L):
63
小写时(%l):
com.XXX.XXX.job.QuYiTask.jsutShow(QuYiTask.java:63))

[QC] 是log信息的开头,可以为任意字符,一般为项目简称。

输出的信息

[TS] DEBUG [main] AbstractBeanFactory.getBean(189) | Returning cached instance of singleton bean 'MyAutoProxy'
具体讲解可参照第三部分定义配置文件中的格式化日志信息。

log4j.appender.R=org.apache.log4j.DailyRollingFileAppender

此句与第3行一样。定义名为R的输出端的类型为每天产生一个日志文件。

log4j.appender.R.File=D:\Tomcat 5.5\logs\qc.log

此句为定义名为R的输出端的文件名为D:\Tomcat 5.5\logs\qc.log
可以自行修改。

备注:将日志文件输出到tomcat自身的日志文件夹logs中

# Set root category priority to info and its only appender to console. 
log4j.rootCategory=info,console,R

# console is set to be a ConsoleAppender using a PatternLayout. 
log4j.appender.console=org.apache.log4j.ConsoleAppender 
log4j.appender.console.Threshold=info 
log4j.appender.console.layout=org.apache.log4j.PatternLayout 
log4j.appender.console.layout.ConversionPattern=- %m%n

# R is set to be a File appender using a PatternLayout.
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.Append=true
log4j.appender.R.Threshold=info 
log4j.appender.R.MaxFileSize=1024KB 
log4j.appender.R.MaxBackupIndex=10
log4j.appender.R.File=${catalina.base}/logs/shuju_admin.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%p:%rms][%t][%l]%n- %m%n
如图:



log4j.appender.R.layout=org.apache.log4j.PatternLayout

与第4行相同。

log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n

与第5行相同。

log4j.logger.com. neusoft =DEBUG

指定com.neusoft包下的所有类的等级为DEBUG。
可以把com.neusoft改为自己项目所用的包名。

log4j.logger.com.opensymphony.oscache=ERROR


log4j.logger.net.sf.navigator=ERROR

这两句是把这两个包下出现的错误的等级设为ERROR,如果项目中没有配置EHCache,则不需要这两句。

log4j.logger.org.apache.commons=ERROR


log4j.logger.org.apache.struts=WARN

这两句是struts的包。

log4j.logger.org.displaytag=ERROR

这句是displaytag的包。(QC问题列表页面所用)

log4j.logger.org.springframework=DEBUG

此句为Spring的包。

log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN


log4j.logger.org.hibernate=DEBUG

此两句是hibernate的包。

以上这些包的设置可根据项目的实际情况而自行定制。

设置为每日生成一个日志文件的例子:

log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=D:/temp/log
log4j.appender.R.DatePattern = '_'yyyy-MM-dd'.log'
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%p] %t [%c]?- %m%n

注意:log4j会先生成log这样一个文件,然后当这一天过去的时候,生成一个新的log,然后把原来的保存为加上日期格式后缀的文件


配置Error级别的日志,单独写入到一个文件中:

log4j.appender.error=error
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.Append=true
log4j.appender.error.Encoding=UTF-8
log4j.appender.error.Threshold=ERROR
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%p:%rms][%t][%l]%n%m%n
log4j.appender.error.File=D:/server/logs/shuju_admin_error.log

示例

使用log4j大概涉及3个主要概念:
公共类 Logger
Logger  负责处理日志记录的大部分操作。
公共接口 Appender
Appender  负责控制日志记录操作的输出。
公共抽象类Layout
Layout  负责格式化Appender的输出。

控制台下的示例(没有使用log4j.properties配置文件):

Consandpatt.java 输出指定格式日志到控制台:

package mylog;

import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;

public class Consandpatt {
	static Logger logger = Logger.getLogger(Consandpatt.class);

	public static void main(String args[]) {
		// Note, %n is newline
		String pattern = "Milliseconds since program start: %r %n";
		pattern += "Classname of caller: %C %n";
		pattern += "Date in ISO8601 format: %d{ISO8601} %n";
		pattern += "Location of log event: %l %n";
		pattern += "Message: %m %n %n";

		PatternLayout layout = new PatternLayout(pattern);
		ConsoleAppender appender = new ConsoleAppender(layout);

		logger.addAppender(appender);
		logger.setLevel((Level) Level.DEBUG);
		logger.debug("Here is some DEBUG");
		logger.info("Here is some INFO");
		logger.warn("Here is some WARN");
		logger.error("Here is some ERROR");
		logger.fatal("Here is some FATAL");
	}
}


输出结果如下:
Milliseconds since program start: 0 
Classname of caller: mylog.Consandpatt 
Date in ISO8601 format: 2013-11-06 23:16:33,708 
Location of log event: mylog.Consandpatt.main(Consandpatt.java:25) 
Message: Here is some DEBUG 

Milliseconds since program start: 3 
Classname of caller: mylog.Consandpatt 
Date in ISO8601 format: 2013-11-06 23:16:33,711 
Location of log event: mylog.Consandpatt.main(Consandpatt.java:26) 
Message: Here is some INFO 

Milliseconds since program start: 3 
Classname of caller: mylog.Consandpatt 
Date in ISO8601 format: 2013-11-06 23:16:33,711 
Location of log event: mylog.Consandpatt.main(Consandpatt.java:27) 
Message: Here is some WARN 

Milliseconds since program start: 4 
Classname of caller: mylog.Consandpatt 
Date in ISO8601 format: 2013-11-06 23:16:33,712 
Location of log event: mylog.Consandpatt.main(Consandpatt.java:28) 
Message: Here is some ERROR 

Milliseconds since program start: 4 
Classname of caller: mylog.Consandpatt 
Date in ISO8601 format: 2013-11-06 23:16:33,712 
Location of log event: mylog.Consandpatt.main(Consandpatt.java:29) 
Message: Here is some FATAL

Htmlandwrite.java 使用HTMLLayout布局输出到html文件

package mylog;

import java.io.FileOutputStream;
import org.apache.log4j.HTMLLayout;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.WriterAppender;

public class Htmlandwrite {
	static Logger logger = Logger.getLogger(Htmlandwrite.class);

	public static void main(String args[]) {
		HTMLLayout layout = new HTMLLayout();
		WriterAppender appender = null;

		try {
			FileOutputStream output = new FileOutputStream("output2.html");
			appender = new WriterAppender(layout, output);
		} catch (Exception e) {
			e.printStackTrace();
		}
		logger.addAppender(appender);
		// 设置日志级别为“DEBUG”
		logger.setLevel((Level) Level.DEBUG);

		logger.debug("Here is some DEBUG");
		logger.info("Here is some INFO");
		logger.warn("Here is some WARN");
		logger.error("Here is some ERROR");
		logger.fatal("Here is some FATAL");
	}
}

输出结果:

Simpandfile.java 输出日志到文本

package mylog;

import org.apache.log4j.FileAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.SimpleLayout;

public class Simpandfile {
	static Logger logger = Logger.getLogger(Simpandfile.class);

	public static void main(String args[]) {
		SimpleLayout layout = new SimpleLayout();
		FileAppender appender = null;

		try {
			appender = new FileAppender(layout, "output1.txt", false);
		} catch (Exception e) {
			e.printStackTrace();
		}
		logger.addAppender(appender);
		logger.setLevel((Level) Level.DEBUG);
		logger.debug("Here is some DEBUG");
		logger.info("Here is some INFO");
		logger.warn("Here is some WARN");
		logger.error("Here is some ERROR");
		logger.fatal("Here is some FATAL");
	}
}

输出结果(output1.txt中):
DEBUG - Here is some DEBUG
INFO - Here is some INFO
WARN - Here is some WARN
ERROR - Here is some ERROR
FATAL - Here is some FATAL


使用配置文件

Log4j经常与外部日志文件联合使用,这样很多可选项不必硬编码在软件中。使用外部配置文件的优点就是修改可选项不需要重新编译程序。唯一的缺点就是,由于用到io 指令,速度稍微有些减慢。

在此演示 log4j.properties 配置文件的情况

对于一般的 java project  log4j 会自动在 classpath 下,找到配置文件并初始化。
Log4j.properties:

log4j.rootLogger=info, 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.DailyRollingFileAppender
log4j.appender.R.File=D:/temp/logs
log4j.appender.R.DatePattern = '_'yyyy-MM-dd'.log'
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%p] [%l] thread=[%t] %nmsec=%r - %m%n

Test.java 
package mylog;

import org.apache.log4j.Logger;

public class Test {
	static Logger log = Logger.getLogger(Test.class);

	public void log() {
		log.debug("Debug info.");
		log.info("Info info");
		log.warn("Warn info");
		log.error("Error info");
		log.fatal("Fatal info");
	}

	public static void main(String[] args) {
		Test test = new Test();
		test.log();
	}
}


执行代码之后,会在控制台和文件中,记录日志信息,结果分别如下:
控制台:
INFO [main] (Test.java:10) - Info info
WARN [main] (Test.java:11) - Warn info
ERROR [main] (Test.java:12) - Error info
FATAL [main] (Test.java:13) - Fatal info
logs文件:
2013-11-06 23:27:58 [INFO] [mylog.Test.log(Test.java:10)] thread=[main] 
msec=0 - Info info
2013-11-06 23:27:58 [WARN] [mylog.Test.log(Test.java:11)] thread=[main] 
msec=2 - Warn info
2013-11-06 23:27:58 [ERROR] [mylog.Test.log(Test.java:12)] thread=[main] 
msec=3 - Error info
2013-11-06 23:27:58 [FATAL] [mylog.Test.log(Test.java:13)] thread=[main] 
msec=3 - Fatal info

具体格式说明,请参照上文

参考文献:
http://blog.csdn.net/wlq1983/article/details/2827638
http://blog.csdn.net/terryzero/article/details/4013111
http://www.blogjava.net/kit-soft/archive/2009/08/28/292977.html

Log4j按级别输出日志到不同文件配置分析



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值