当前位置: 技术问答>java相关
[重谢]哪位手把手教下如何使用Log4J,请给出具体步骤
来源: 互联网 发布时间:2015-09-28
本文导语: Log4J的手册看得不明白 请高人指点一下 给一下使用的步骤(要求按着步骤就能跑起来) 非常感谢 | Log4j的基本应用 Introduction Log4j 是一个开源代码的项目(Open source project),它使开发人员...
Log4J的手册看得不明白
请高人指点一下
给一下使用的步骤(要求按着步骤就能跑起来)
非常感谢
请高人指点一下
给一下使用的步骤(要求按着步骤就能跑起来)
非常感谢
|
Log4j的基本应用
Introduction
Log4j 是一个开源代码的项目(Open source project),它使开发人员能最大限度的灵活控制程序调试信息的输出,这一点它是通过额外的配置文件实现的。而且log4j 开发包很容易上手,同时可能会使一些开发人员上瘾。
绝大多数的大型开发项目都有它们自己专门用于记录程序日志和对程序跟踪调试的API。许多经验证明,调试信息的管理在软件开发过程中扮演了十分重要的角色。日志管理通常提供了以下的几点好处:首先,它能在程序运行过程中精确的提供运行时的上下文(context)方便我开发人员找到 BUG,一旦在程序中加入了Log 输出的代码,程序运行过程中就能自动的生成并输出logging信息。其次,log信息可以输出到不同的地方(控制台,文件,日志服务器等等)以备时候研究。最后,除了在开发过程中发挥它的作用外,一个功能足够强大的日志记录开发包能当作一个审计工具(audit tool)使用。
为了能够适应以上的规律,早在1996年 EU SEMPER(Secure Electronic Marketplace for Europe) 项目组决定开发自己的日志管理开发包(tracing API),经过了无数次的改动和功能加强,最终诞生了log4j —— 一个十分广受欢迎的java logging 开发工具包。这个开发工具包的发行遵循 IBM Public License,certified by the open source initiative。
同时,Logging 确实也存在一些缺陷,比如,它影响了程序运行的速度,增加了代码的开销,增加了许多无谓的输出。为了减少这些负面因数的影响,log4j 被设计得尽量的高效和灵活。因为,很少有哪个应用程序(系统)把记录日志当作主要的功能,log4j的开发人员尽量使log4j容易理解和使用。
这篇文章首先描述log4j的大致框架和重要的组成部分。作者通过一些简单的例子来说明如何使用log4j。
Categories,appenders,and layouts
Log4j最主要的三大基本构件:
1.Categories(对log信息进行分类筛选,通俗的讲就是什么信息应该被输出,什么log信息应该被忽略)
2.Appenders(定义了log信息输出的设备,log信息应该被输出到什么地方,控制台、文件、网络设备等)
3.Layouts(对log信息进行格式化)
软件开发人员能通过这三大构件实现根据日志的类型和优先级进行记录,并且能在程序运行时去控制log 信息输出的格式(formatted)和往什么地方输出(控制台、log文件),让我们依次去了解他们。
Category hierarchy
与System.out.println 方式输出调试信息相比,一个专门的日志控制工具(logging API)的最组要优点在于它能够在适当的时候关闭一些调试信息输出以不影响其他人的调试。这种能力的实现决定于程序开发人员能够根据一定的标准对这些logging 信息进行分类。
基于以上原则,org.apache.log4j.Category 类实现了整个log4j包的核心,调试信息被根据一般开发人员的习惯进行了分类并命名。和java开发包的分类规则类似,(a category is said to be a parent of another category if its name followed by a dot, is a profix of the child category name. ) 比如,命名为com.foo 的category 是被命名为com.foo.Bar 的category的parent.就象我们习惯的java是java.util 的parent,并且是java.util.vector 的ancestor一样。
最上层的Category被称为根(root category),根category有两个特点:
(1)它总是存在(It always exists)
(2)它的名字不能被直接得到
在Category 类里面,我们通过getRoot()方法得到root category。而静态方法getInstance()实例化所有其他的Category. getInstance()通过调用时传递的叁数得到该被实例化的Category的实例名。 Category类的其它方法在下面列出:
package org.apache.log4j;
public Category class {
// Creation & retrieval methods:
public static Category getRoot();
public static Category getInstance(String name);
// printing methods:
public void debug(String message);
public void info(String message);
public void warn(String message);
public void error(String message);
// generic printing method:
public void log(Priority p, String message);
}
我们可以通过org.apache.log4j.Priority类中的set 方法定义一个Category的优先级。(设置的Category的优先级别和传统的Unix Syslog 定义的级别一样)。但log4j仅鼓励使用以下的四个优先级别:ERROR,WARN,INFO 和DEBUG, 这四个级别的优先级为ERROR>WARN>INFO>DEBUG。但org.apache.log4j.Propority中的set方法提供了更高的灵活性,即用户可以通过Priority类的子类去定义自己的优先级。如果一个 category没有被定义自己的优先级别,它将继承最接近的祖先所定义的优先级别。这样就保证了所有的Category最终都继承一个优先级别(因为根category总是有一个默认的优先级定义)。
我们获得了一个Category 的实例以后,就可以通过调用以下的方法输出调试信息:
1.error() 输出ERROR级别的调试信息
2.warn() 输出WARN级别的调试信息
3.info() 输出INFO 级别的调试信息
4.debug() 输出 DEBUG 级别的调试信息
5.log() 普通的LOG 信息
根据定义,以上的5个方法将自己判断输出信息的优先级别。打个比方,假如c 是一个Category 类的实例,那么语句c.info(“……”) 只有在优先级达到INFO级的输出请求(A logging request)时候才被执行。
日志输出请求(A logging request) 是指当调试级别高于或等于该级别的时候才被允许执行。否则,被认为这个日志输出请求为不允许,一个没有被定义优先级别的category 将自动根据层次关系从它的parent 或 ancestor 继承优先级别。
通过下面的程序段,你将发现这个规则:
// get a category instance named "com.foo"
Category cat = Category.getInstance("com.foo");
// Now set its priority.
cat.setPriority(Priority.INFO);
Category barcat = Category.getInstance("com.foo.Bar");
// This request is enabled, because WARN >= INFO.
cat.warn("Low fuel level.");
// This request is disabled, because DEBUG = INFO.
barcat.info("Located nearest gas station.");
// This request is disabled, because DEBUG
Introduction
Log4j 是一个开源代码的项目(Open source project),它使开发人员能最大限度的灵活控制程序调试信息的输出,这一点它是通过额外的配置文件实现的。而且log4j 开发包很容易上手,同时可能会使一些开发人员上瘾。
绝大多数的大型开发项目都有它们自己专门用于记录程序日志和对程序跟踪调试的API。许多经验证明,调试信息的管理在软件开发过程中扮演了十分重要的角色。日志管理通常提供了以下的几点好处:首先,它能在程序运行过程中精确的提供运行时的上下文(context)方便我开发人员找到 BUG,一旦在程序中加入了Log 输出的代码,程序运行过程中就能自动的生成并输出logging信息。其次,log信息可以输出到不同的地方(控制台,文件,日志服务器等等)以备时候研究。最后,除了在开发过程中发挥它的作用外,一个功能足够强大的日志记录开发包能当作一个审计工具(audit tool)使用。
为了能够适应以上的规律,早在1996年 EU SEMPER(Secure Electronic Marketplace for Europe) 项目组决定开发自己的日志管理开发包(tracing API),经过了无数次的改动和功能加强,最终诞生了log4j —— 一个十分广受欢迎的java logging 开发工具包。这个开发工具包的发行遵循 IBM Public License,certified by the open source initiative。
同时,Logging 确实也存在一些缺陷,比如,它影响了程序运行的速度,增加了代码的开销,增加了许多无谓的输出。为了减少这些负面因数的影响,log4j 被设计得尽量的高效和灵活。因为,很少有哪个应用程序(系统)把记录日志当作主要的功能,log4j的开发人员尽量使log4j容易理解和使用。
这篇文章首先描述log4j的大致框架和重要的组成部分。作者通过一些简单的例子来说明如何使用log4j。
Categories,appenders,and layouts
Log4j最主要的三大基本构件:
1.Categories(对log信息进行分类筛选,通俗的讲就是什么信息应该被输出,什么log信息应该被忽略)
2.Appenders(定义了log信息输出的设备,log信息应该被输出到什么地方,控制台、文件、网络设备等)
3.Layouts(对log信息进行格式化)
软件开发人员能通过这三大构件实现根据日志的类型和优先级进行记录,并且能在程序运行时去控制log 信息输出的格式(formatted)和往什么地方输出(控制台、log文件),让我们依次去了解他们。
Category hierarchy
与System.out.println 方式输出调试信息相比,一个专门的日志控制工具(logging API)的最组要优点在于它能够在适当的时候关闭一些调试信息输出以不影响其他人的调试。这种能力的实现决定于程序开发人员能够根据一定的标准对这些logging 信息进行分类。
基于以上原则,org.apache.log4j.Category 类实现了整个log4j包的核心,调试信息被根据一般开发人员的习惯进行了分类并命名。和java开发包的分类规则类似,(a category is said to be a parent of another category if its name followed by a dot, is a profix of the child category name. ) 比如,命名为com.foo 的category 是被命名为com.foo.Bar 的category的parent.就象我们习惯的java是java.util 的parent,并且是java.util.vector 的ancestor一样。
最上层的Category被称为根(root category),根category有两个特点:
(1)它总是存在(It always exists)
(2)它的名字不能被直接得到
在Category 类里面,我们通过getRoot()方法得到root category。而静态方法getInstance()实例化所有其他的Category. getInstance()通过调用时传递的叁数得到该被实例化的Category的实例名。 Category类的其它方法在下面列出:
package org.apache.log4j;
public Category class {
// Creation & retrieval methods:
public static Category getRoot();
public static Category getInstance(String name);
// printing methods:
public void debug(String message);
public void info(String message);
public void warn(String message);
public void error(String message);
// generic printing method:
public void log(Priority p, String message);
}
我们可以通过org.apache.log4j.Priority类中的set 方法定义一个Category的优先级。(设置的Category的优先级别和传统的Unix Syslog 定义的级别一样)。但log4j仅鼓励使用以下的四个优先级别:ERROR,WARN,INFO 和DEBUG, 这四个级别的优先级为ERROR>WARN>INFO>DEBUG。但org.apache.log4j.Propority中的set方法提供了更高的灵活性,即用户可以通过Priority类的子类去定义自己的优先级。如果一个 category没有被定义自己的优先级别,它将继承最接近的祖先所定义的优先级别。这样就保证了所有的Category最终都继承一个优先级别(因为根category总是有一个默认的优先级定义)。
我们获得了一个Category 的实例以后,就可以通过调用以下的方法输出调试信息:
1.error() 输出ERROR级别的调试信息
2.warn() 输出WARN级别的调试信息
3.info() 输出INFO 级别的调试信息
4.debug() 输出 DEBUG 级别的调试信息
5.log() 普通的LOG 信息
根据定义,以上的5个方法将自己判断输出信息的优先级别。打个比方,假如c 是一个Category 类的实例,那么语句c.info(“……”) 只有在优先级达到INFO级的输出请求(A logging request)时候才被执行。
日志输出请求(A logging request) 是指当调试级别高于或等于该级别的时候才被允许执行。否则,被认为这个日志输出请求为不允许,一个没有被定义优先级别的category 将自动根据层次关系从它的parent 或 ancestor 继承优先级别。
通过下面的程序段,你将发现这个规则:
// get a category instance named "com.foo"
Category cat = Category.getInstance("com.foo");
// Now set its priority.
cat.setPriority(Priority.INFO);
Category barcat = Category.getInstance("com.foo.Bar");
// This request is enabled, because WARN >= INFO.
cat.warn("Low fuel level.");
// This request is disabled, because DEBUG = INFO.
barcat.info("Located nearest gas station.");
// This request is disabled, because DEBUG