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 输出日志信息所属的类的类名
%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))
输出的信息
[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