关于日志的管理, 有多种方法, 其中 Log4j 就是其中比较好的一个日志管理框架, 在网上找了一些写下来方便用到是直接参考, 呵呵省得到时手忙脚乱的找....
1, Log4j 是什么?
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
Log4j可以帮助调试(有时候debug是发挥不了作 用的)和分析,要下载和了解更详细的内容,还是访问其官方网站吧:http://jakarta.apache.org/log4j/ 或者网上搜索更多资料
2, Log4j 的概念
(1), Log4j中有三个主要的组件,它们分别是 Logger(记录器)、Appender(输出目标)和 Layout(输出方式),Log4j 允许开发人员定义多个Logger,每个Logger拥有自己的名字,Logger之间通过名字来表明隶属关系, 如 log4j.logger.net.sf.hibernate = info,stdout。有一个Logger称为Root,它永远存在,且不能通过名字检索或引用,可以通过Logger.getRootLogger( ) 方法获得,其它Logger通过 Logger.getLogger(String name)方法。
(2), Appender 则是用来指明将所有的log信息存放到什么地方,Log4j中支持多种appender,如 console、files、GUI components、NT Event Loggers等,一个Logger可以拥有多个Appender,也就是你既可以将Log信息输出到屏幕,同时存储到一个文件中。
(3), Layout 的作用是控制 Log 信息的输出方式,也就是格式化输出的信息。
(4), Log4j中将要输出的Log信息定义了5种级别,从低到高(严重程度由小到大)分别依次为 DEBUG(调试)、INFO(信息)、WARN(警告)、ERROR(错误)和 FATAL(致命),当输出时,只有级别高过(或等于)配置中规定的级别的信息才能真正的输出,这样就很方便的来配置不同情况下要输出的内容,而不需要更改代码,这点实在是方便啊。
3, Log4j 的配置文件
虽然可以不用配置文件,而在程序中实现配置,但这种方法在如今的系统开发中显然是不可取的,能采用配置文件的地方一定一定要用配置文件。Log4j支持两 种格式的配置文件:XML格式和Java的 property 格式,推荐使用后者,首先看一个简单的例子吧,如下:
-------------------------------------------------------------------------------------------------------------------
log4j.rootLogger=debug, stdout, R
log4j.logger.net.sf.hibernate=info,stdout
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.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize= 100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
-------------------------------------------------------------------------------------------------------------------
以上可以看出Log4J配置文件的基本格式如下:
------------------------------------------
#配置根Logger
log4j.rootLogger = [ level ] , appenderName1 , appenderName2 , …
#配置一个新的logger[ xxx.yyy.kkk ]
log4j.logger.xxx.yyy.kkk = [ level ] , appenderName1 , appenderName2 , …
#配置日志信息输出目的地(可多个)Appender,
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.optionN = valueN
#配置日志信息的格式(布局)
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.optionN = valueN
------------------------------------------
首先,是设置root logger,格式为:
log4j.rootLogger = [level],appenderName1 [, ……]
其它 logger [如: xxx.yyy.kkk ]
log4j.logger.xxx.yyy.kkk = [level],appenderName1 [, ……]
其中level就是设置需要输出信息的级别,
后面是输出的目标/目的地,appenderName 就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地,
配置日志信息输出目的地Appender,其语法为:
log4j.appender.appenderName(输出目标名称) = fully.qualified.name.of.appender.class
#设置输出目标的各个选项配置信息,可多个
log4j.appender.appenderName.option1 = value1
...
log4j.appender.appenderName.optionN = valueN
Log4j 提供的appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生新文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
Log4j 采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:
%m 输出代码中指定的消息
%p 输出优先级,(从低到高)即DEBUG,INFO,WARN,ERROR,FATAL ,根记录器的默认级别是Level.DEBUG, %5p 输出名称的字符(如info)数小于5时的对齐方式,默认为右对齐,下面其它项类似的;
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名,%c{1}为仅输出类名, %c{2}为输出类名和紧接的所属的包名,%c{3}为在%c{2}的基础上再输出紧接着的上层包名,其它类似的...各个名字间用点号连接,同时各个名称的个数之和正好等于{}里面的数字;
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似: 2002年10月18日 22:10:28,921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
%F 输出日志消息产生时所在的文件名称
4, 在程序中使用 Log4j
要在自己的程序中使用Log4j,首先需要将 commons- logging.jar 和 logging-log4j-1.2.9.jar 导入到构建路径中。然后再将 log4j.properties 放到src根(或WEB-INF/classes)目录下。这样就可以在程序中使用Log4j 了。在类中使用 Llog4j ,首先声明一个静态变量 Logger logger=Logger.getLog("classname");现在就可以使用了,用法如下:logger.debug("debug message")或者logger.info("info message"),看下面一个小例子:
import com.foo.Bar;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class MyApp {
static Logger logger = Logger.getLogger(MyApp.class.getName()); //定义静态变量
public static void main(String[] args) {
// BasicConfigurator replaced with PropertyConfigurator.
PropertyConfigurator.configure(args[0]);
logger.info("Entering application.");
Bar bar = new Bar();
bar.doIt();
logger.info("Exiting application.");
}
}
5, 如何将 Log4j 应用到一个Web项目中?
第一步:在工程中加入log4j所使用的jar文件
(1):项目 > 属性 :弹出项目的属性窗口
(2):Java构建路径>?库>?添加外部JAR:弹出选择JAR的窗口
(3):通过选择JAR的窗口,找到log4j-1.2.x.jar,选中并确认
(4):回到项目的属性窗口,点击确定
第二步:创建log4j.properties文件方法
(1):选择欲使用log4j的项目>?右键点击src > ?新建> ?其他 :弹出选择向导窗口
(2):在选择向导窗口中,选择常规?> 文件?> 下一步:弹出新建文件的窗口
(3):在新建文件窗口中,输入文件名log4j.properties ? 完成:创建工作结束
第三步:编写log4j.properties文件,配置日志信息
### 把日志信息输出到控制台 ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender #//日志信息将写到控制台
log4j.appender.stdout.Target=System.out #//信息打印到System.out上
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %m%n #//指定输出格式:显示日期和log信息
### 把日志信息输出到文件:xlogFile.log ###
log4j.appender.file=org.apache.log4j.FileAppender #//日志信息将写到文件中
log4j.appender.file.File=xlogFile.log #//指定日志输出的文件名
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %l %m%n #//指定输出格式:显示日期,日志发生位置和日志信息
### 设置优先级别、以及输出源 ###
log4j.rootLogger=debug, stdout, file //设置根记录器优先级别为debug、
log4j.logger.net.sf.hibernate=info,stdout //设置另一个记录器优先级别为 info、输出目标为stdout
#日志被输出到多个输出源
#注:优先级从高到低分别是ERROR、WARN、INFO、DEBUG
#在此处,如果优先级别设为info,那么使用debug方法打印的日志信息将不被输出
第四步:使用log4j记录日志信息
import org.apache.log4j.Logger;
public class Log4j {
public static void main(String[] args) {
Logger logger = Logger.getLogger(this.getClass().getName());//获取日志记录器,这个记录器将负责控制日志信息
try {
logger.debug("设置教师的ID的编号。");//使用Logger对象的debug、info方法输出日志信息
}catch(IllegalArgumentException ex) {
logger.info(ex.getMessage());//使用Logger对象的debug、info方法输出日志信息
}
}
}
6, 一个真实项目的 Log4j 配置文件如下(作为参考):
### direct log messages to stdout (注释)###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file hibernate.log ###
# Log4j提供的appender有以下几种:
# org.apache.log4j.ConsoleAppender(控制台)
# org.apache.log4j.FileAppender(文件)
# org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
# org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生新文件)
# org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ##
#语法: log4j.rootLogger = [ level ] , appenderName1 , appenderName2 , …
log4j.rootLogger=info,stdout
log4j.logger.net.sf.hibernate=info
log4j.logger.com.hzzk.common=debug,stdout
log4j.logger.org.groller.framework=debug
log4j.logger.com.hzzk.www.common=debug, stdout