⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 log4j_usage_detail.txt

📁 log4j使用文档中的中上品。 包括:1
💻 TXT
📖 第 1 页 / 共 3 页
字号:
常见的日志实现及其比较

目前常见的基于 Java 的日志实现有 Apache Log4j、Jakarta commons logging、Java Logging APIs 包和 Apache Excalibur LogKit 等。这些日志实现的介绍如下:

Apache Log4j

Log4j 最早可追溯至 1996 年初的 EU SEMPER(欧洲安全电子市场)项目,经过数次优化和改进,该 API 曾作为 IBM alphaWorks 的一个项目按 IBM 公共许可证分发,由开放源码权威机构认证。现在,Log4j 已经成为 Apache Logging Service 的项目之一,在 Apache Software License 下分发。有关 Apache Log4j 的更多信息,请访问 Apache Log4j 的主页,或 IBM developerWorks 文章:Log4j delivers control over logging。

Jakarta commons logging

Jakarta commons logging (JCL) 是 Apache Jakarta 项目的 commons 子项目的一个组件,其是应用程序和底层的具体日志实现之间的接口。基于 JCL 的统一接口,开发人员可以选择不同的日志实现作为底层的日志基础,而不影响上层的应用程序。同时,JCL 中也默认提供了两个基本的简单日志实现:NoOpLog 和 SimpleLog。如果没有指定底层的日志实现类,应用程序将默认调用 SimpleLog。有关 Jakarta commons logging 的更多信息,请访问 Jakarta commons logging 的主页。

Java Logging APIs

从 J2SE 1.4 开始,Java 2 SDK 中开始提供了日志功能,包含在 java.util.logging 包中。有关 Java Logging APIs 的更多信息,请查阅Java 2 JDK 文档或 Java Logging APIs的主页。

Apache Excalibur LogKit

LogKit 最早曾是 Apache Avalon 项目的组成部分,随着项目的发展与成熟,Avalon 被拆分为多个项目。LogKit 被归入其中一个分支-Apache Excalibur 项目中。有关Apache Excalibur LogKit的更多信息,请访问 Apache Excalibur LogKit 的主页。

常见日志实现的比较

以上四种常见的日志实现各有所长,在实际开发过程中,需要分析应用程序的具体情况,选择适合项目开发的日志实现。本文通过分析 Apache Log4j、Jakarta commons logging、Java Logging APIs 和 Apache Excalibur LogKit 的优缺点,列举了一些常用的开发实践经验。

1) 因为多年的发展和改进,Apache Log4j 具有完善的功能和丰富的特性,也成为了基于 Java 的日志实现框架的事实标准。但由于 Log4j 是 Apache 开放源代码项目,所以,Apache Log4j 不太适合项目开发对开源库的使用有一定限制的情况。

2) JCL 为所有底层的日志实现提供了一个统一的接口,但其自身实现的日志功能较弱(只有简单的 NoOpLog 和 SimpleLog),所以通常需要和其他具体的日志实现结合使用。JCL 适合项目开发过程中不能决定采用哪个具体日志实现的情况,因为 JCL 的特性保证了不用修改代码即可以完成底层日志实现的更换。但实际开发中,需要更换底层日志实现的情况较少,且采用 JCL 所引入的开发成本并未产生新的日志特性,因此选用 JCL 之前建议仔细评估。

3) Java Logging APIs 具有和 Apache Log4j 类似的功能,但不及后者成熟,日志特性也没有后者丰富,所以,应用场景也不如后者广泛。

4) Apache Excalibur LogKit 与另外几种日志实现的最大区别在于其可以输出多项日志信息,而不仅仅是输出一行日志信息,从而便于将日志输出直接插入到数据库中。





watson Guo 注1:现在J2EE中更多的日志用法是使用JCL接口,连后使用log4j作为实现。这样避免了log4j.properties在java程序中的指定,而只需要放到yrapp.war/web-info/classes/下。 你可以发现在appfuse,springside,还有其他开源的j2ee项目中,几乎都是这么做的。。



watson Guo 注2:log4j问题:当war跑在jboss,weblogic,websphere里面时,应用服务器的log4j.xml会覆盖应用的日志配置。
此时要想war的日志配置起作用,有2各办法: 
      (1)。修改jboss/conf/log4j.xml使之符合自己的要求。(2)直接在应用classpath/下建立jboss-web.xml 和 log4j.xml具体可网上查。
    恶性的是在windows下面RollFileAppender是有问题的,日志的文件编号出问题。估计是和缓存大小有关系,但是不影响使用。 。
。在linux/unxi下没问题。



//////////////////////////////////////////////////////////



日志的配置 
设置日志时使用的格式保留符号有:c,C,d,F,l,L,m,M,n,p,r,t,x,X,% 等等 
C: 输出触发日志事件的文件的类名 输出形如:包名.类名 
c: 输出触发日志事件的文件的文件名     输出形如: 文件名 
d: 触发日志事件的日期 
F: 触发日志的文件名 
l: 触发日志事件的文件及行数信息  输出形如:包名.类名.方法名(文件名 行数) 
L: 触发日志事件的文件行数 
m: 输出系统设定的日志信息 
M: 输出触发日志事件的方法名 
n: 日志输出时换行     使用形如:"\n"or"\r\n 
p: 日志事件的优先级别 
r: 系统运行到触发日志事件之间的时间消耗(毫秒) 
t: 触发日志事件的线程 
x: 输出触发日志事件的线程的NDC (nested diagnostic context):线程互斥时用 
X: 输出触发日志事件的线程的MDC (mapped diagnostic context)使用形如: 
%X{clientNum}clientNum 为mapKey 
%: 格式字符的确认校验符号     在每个格式符号前使用 
输出的列宽设定: 
格式修饰符  左调整  最小列宽  最大列宽                             说明 
  %20c             false           20            none             如果输出少于20字符,左边补空格 
  %-20c           true            20            none          如果输出少于20字符,右边补空格 
  %.30c           NA           none            30               如果输出大于30从左开头截去 
 %20.30c       false            20             30        输出字符少于20,左补空格;多于30,左开头截去 
%-20.30c       true            20              30               输出字符少于20,右补空格;多于30,左开头截去 
使用例子: 
-------------------------------------------------------------------------------------------------------- 
类名:"org.apache.xyz.SomeClass"  %C{1}     输出 "SomeClass"   
%d{dd MMM yyyy HH:mm:ss,SSS} 
(格式未指定时使用 ISO8601格式标准"YYYY-mm-dd HH:mm:ss,SSS" ) -------------------------------------------------------------------------------------------------------- 
[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n 
[DEBUG] 2002-11-12 12:00:57,376   method:log.Untitled1.main(Untitled1.java:38) 
tryOutput  
-------------------------------------------------------------------------------------------------------- 
 [%d{HH:mm:ss}] %p (%c %L) %x - %m%n 
[11:36:11] INFO (try.java 22)  - hello 
-------------------------------------------------------------------------------------------------------- 
  [%d] %p (%c %l) %x - %m%n 
[2003-08-29 11:37:05,662] INFO (try.java log.Untitled1.main(Untitled1.java:22))  
-         hello 
-------------------------------------------------------------------------------------------------------- 
  {%d}%p (%C %n %l) %x - %m    %M%n 
{2003-08-29 11:40:29,585} INFO (log.Untitled1 
log.Untitled1.main(Untitled1.java:38) )  - tryOutput    main 
 
    注: 
       1.格式保留符号使用时,每个前面都要加%号,两个%号则输出一个% 
    2.格式设定时,若使用到非保留符号或保留符号前未加%,则视为一般子符(串)输出,包括空格,空行 
    3.使用保留符号中的大写符号时,需考虑时间影响.
日志的级别:
    常用的日志级别包括:
     debug:最常使用的日志级别.
     info:一些重要信息的提示级别.
     error:重大错误级别.
     fatal:致命错误级别
     all:所有的日志都显示级别.
     warn:警告错误级别.   
    off:所有日志都不显示级别. 

设置日志时使用的格式保留符号有:c,C,d,F,l,L,m,M,n,p,r,t,x,X,% 等等
C: 输出触发日志事件的文件的类名 输出形如:包名.类名
c: 输出触发日志事件的文件的文件名     输出形如: 文件名 
d: 触发日志事件的日期
F: 触发日志的文件名
l: 触发日志事件的文件及行数信息  输出形如:包名.类名.方法名(文件名 行数)
L: 触发日志事件的文件行数
m: 输出系统设定的日志信息
M: 输出触发日志事件的方法名
n: 日志输出时换行     使用形如:"\n"or"\r\n
p: 日志事件的优先级别 
r: 系统运行到触发日志事件之间的时间消耗(毫秒)
t: 触发日志事件的线程
x: 输出触发日志事件的线程的NDC (nested diagnostic context):线程互斥时用
X: 输出触发日志事件的线程的MDC (mapped diagnostic context)使用形如: 
%X{clientNum}clientNum 为mapKey 
%: 格式字符的确认校验符号     在每个格式符号前使用
输出的列宽设定:
格式修饰符  左调整  最小列宽  最大列宽               说明
  %20c      false    20        none    如果输出少于20字符,左边补空格
  %-20c     true     20        none    如果输出少于20字符,右边补空格
  %.30c     NA      none      30    如果输出大于30从左开头截去
 %20.30c  false  20        30输出字符少于20,左补空格;多于30,左开头截去
%-20.30c   true    20     30  输出字符少于20,右补空格;多于30,左开头截去
使用例子:
--------------------------------------------------------------------------------------------------------
类名:"org.apache.xyz.SomeClass"  %C{1}     输出 "SomeClass"   
%d{dd MMM yyyy HH:mm:ss,SSS}
(格式未指定时使用 ISO8601格式标准"YYYY-mm-dd HH:mm:ss,SSS" ) --------------------------------------------------------------------------------------------------------
[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n 
[DEBUG] 2002-11-12 12:00:57,376   method:log.Untitled1.main(Untitled1.java:38)
tryOutput  
--------------------------------------------------------------------------------------------------------
 [%d{HH:mm:ss}] %p (%c %L) %x - %m%n
[11:36:11] INFO (try.java 22)  - hello
--------------------------------------------------------------------------------------------------------
  [%d] %p (%c %l) %x - %m%n
[2003-08-29 11:37:05,662] INFO (try.java log.Untitled1.main(Untitled1.java:22))  
-	hello
--------------------------------------------------------------------------------------------------------
  {%d}%p (%C %n %l) %x - %m    %M%n 
{2003-08-29 11:40:29,585} INFO (log.Untitled1 
log.Untitled1.main(Untitled1.java:38) )  - tryOutput    main 

注:1.格式保留符号使用时,每个前面都要加%号,两个%号则输出一个%
2.格式设定时,若使用到非保留符号或保留符号前未加%,则视为一般子符(串)输出,包括空格,空行
3.使用保留符号中的大写符号时,需考虑时间影响.





//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////




在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作;跟踪代码运行时轨迹,作为日后审计的依据;担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息。

最普通的做法就是在代码中嵌入许多的打印语句,这些打印语句可以输出到控制台或文件中,比较好的做法就是构造一个日志操作类来封装此类操作,而不是让一系列的打印语句充斥了代码的主体。

1.2. Log4j简介


在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包-Log4j。

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

此外,通过Log4j其他语言接口,您可以在C、C++、.Net、PL/SQL程序中使用Log4j,其语法和用法与在Java程序中一样,使得多语言分布式系统得到一个统一一致的日志组件模块。而且,通过使用各种第三方扩展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。

本文介绍的Log4j版本是1.2.3。作者试图通过一个简单的客户/服务器Java程序例子对比使用与不使用Log4j 1.2.3的差别,并详细讲解了在实践中最常使用Log4j的方法和步骤。在强调可重用组件开发的今天,相信Log4j将会给广大的设计开发人员带来方便。加入到Log4j的队伍来吧!

一个简单的例子


我们先来看一个简单的例子,它是一个用Java实现的客户/服务器网络程序。刚开始我们不使用Log4j,而是使用了一系列的打印语句,然后我们将使用Log4j来实现它的日志功能。这样,大家就可以清楚地比较出前后两个代码的差别。

2.1. 不使用Log4j


2.1.1. 客户程序 


package log4j ;

import java.io.* ;
import java.net.* ;

/**
 *
 * <p> Client Without Log4j </p>
 * <p> Description: a sample with log4j</p>
 * @version 1.0
 */
public class ClientWithoutLog4j {

    /**
     *
     * @param args
     */
    public static void main ( String args [] ) {

        String welcome = null;
        String response = null;
        BufferedReader reader = null;
        PrintWriter writer = null;
        InputStream in = null;
        OutputStream out = null;
        Socket client = null;

        try {
            client = new Socket ( "localhost", 8001 ) ;
            System.out.println ( "info: Client socket: " + client ) ;
            in = client.getInputStream () ;
            out = client.getOutputStream () ;
        } catch ( IOException e ) {
            System.out.println ( "error: IOException : " + e ) ;
            System.exit ( 0 ) ;
        }

        try{
            reader = new BufferedReader( new InputStreamReader ( in ) ) ;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -