`
xitong
  • 浏览: 6400741 次
文章分类
社区版块
存档分类
最新评论

Log4j 的使用之整体概念

 
阅读更多

Log4j是个日志纪录工具,可以取代system.out.println之类的信息,而且还可以定义信息级别,可以根据需要显示想要得信息,更重要的是合理的使用该工具是个很好的编程好习惯,这也是在最近的项目中得出的一点心得:

1)我们用的是笨重的wsad,如果用调试模式来开发,肯定很慢,养成看日志的习惯,可以加快开发的速度,当然我的意思不是说日志可以取代调试工具,这个要看日志写的详细程度,而且特别复杂的程序,还得靠调试(除非你肯花时间在写日志上,或者将程序设计的简单),但无论如何,在开发时还是应该将两者配合使用,我90%的时间看日志,10%的时间用调试模式

2)日志决不是仅仅用于调试,我们这次开发使用了别人的开发的基础类,全部都打包成jar,在开发过程中如果不看日志信息简直无法找错,你或许会说可以看原文件,但毕竟时间有限,这也给了我们一些提示信息,当我们开发api给别人用的时候,一定写好日志信息,为别人提供方便

说了这么多废话,开始进入正题

A) 安装

  1. http://jakarta.apache.org/log4j/docs/download.html下载log4j发行版。

  2. 解压存档文件到合适的目录中。

  3. 添加目录中的文件 dist/lib/log4j-1.2.9.jarCLASSPATH 环境变量中。(在eclipse中将该jar复制的你的工程下的lib目录中,然后在项目的build path中引用即可)

B) log4j的3个核心概念

B1)Logger:日志写出器

Logger对象是用来取代System.out或者System.err的日志写出器,用来供程序员输出日志信息。

  • Logger的输出方法

Logger类对象提供一系列方法供程序员输出日志信息。

              // Printing methods :
public void debug(Object msg); public void debug(Object msg, Throwable t); public void info(Object msg); public void info(Object msg, Throwable t); public void warn(Object msg); public void warn(Object msg, Throwable t); public void error(Object msg); public void error(Object msg, Throwable t); public void fatal(Object msg); public void fatal(Object msg, Throwable t); // Generic printing method : public void log(Level l, Object msg);

              // Printing methods :
public void debug(Object msg); public void debug(Object msg, Throwable t); public void info(Object msg); public void info(Object msg, Throwable t); public void warn(Object msg); public void warn(Object msg, Throwable t); public void error(Object msg); public void error(Object msg, Throwable t); public void fatal(Object msg); public void fatal(Object msg, Throwable t); // Generic printing method : public void log(Level l, Object msg);

              // Printing methods :
public void debug(Object msg); public void debug(Object msg, Throwable t); public void info(Object msg); public void info(Object msg, Throwable t); public void warn(Object msg); public void warn(Object msg, Throwable t); public void error(Object msg); public void error(Object msg, Throwable t); public void fatal(Object msg); public void fatal(Object msg, Throwable t); // Generic printing method : public void log(Level l, Object msg);

  • Logger的命名规则

Logger由一个String类的名字识别,logger的名字是大小写敏感的,且名字之间具有继承的关系,子名有父名作为前缀,用点号.分隔。如:x.yx.y.z的父亲。

根logger (root logger)是所有logger的祖先,它具有如下属性:1) 它总是存在的;2) 它不可以通过名字获得。

通过调用public static Logger Logger.getRootLogger()获得root logger;通过调用public static Logger Logger.getLogger(String name)或者public static Logger Logger.getLogger(Class clazz)获得(或者创建)一个named logger。后者相当于调用Logger.getLogger(clazz.getName())

在某对象中,用该对象所属的类为参数,调用Logger.getLogger(Class clazz)以获得logger被认为是目前所知的最理智的命名logger的方法。

  • Log level

每个logger都被分配了一个日志级别 (log level),用来控制日志信息的输出。未被分配level的logger将继承它最近的父logger的level。

每条输出到logger的日志请求(logging request)也都有一个level,如果该request的level大于等于该logger的level,则该request将被处理(称为enabled);否则该request将被忽略。故可得知:

  1. logger的level越低,表示该logger越详细
  2. logging request的level越高,表示该logging request越优先输出
  3. 如果没有设置日志记录器(Logger)的级别,那么它将会继承最近的祖先的级别。因此,如果在包com.foo.bar中创建一个日志记录器(Logger)并且没有设置级别,那它将会继承在包com.foo中创建的日志记录器(Logger)的级别。如果在com.foo中没有创建日志记录器(Logger)的话,那么在com.foo.bar中创建的日志记录器(Logger)将继承root 日志记录器(Logger)的级别,root日志记录器(Logger)经常被实例化而可用,它的级别为DEBUG

Level类中预定义了五个level,它们的大小关系如下:

Level.ALL < Level.DEBUG < Level.INFO < Level.WARN < Level.ERROR < Level.FATAL < Level.OFF

有很多方法可以创建一个日志记录器(Logger),

下面方法可以取回root日志记录器:Logger logger = Logger.getRootLogger();

还可以这样创建一个新的日志记录器:Logger logger = Logger.getLogger("MyLogger");

比较常用的用法,就是根据类名实例化一个静态的全局日志记录器:static Logger logger = Logger.getLogger(test.class);

所有这些创建的叫"logger"的日志记录器都可以用下面方法设置级别:logger.setLevel((Level)Level.WARN);

下代码将用自己所属的类为参数,创建一个logger,启用默认配置,设置其level并向其输出若干logging request。import org.apache.log4j.Logger;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;

public class Log4jTest {
public static void main(String argv[]) {


// Create a logger by the name of class Log4jTest.

Logger logger = Logger.getLogger(Log4jTest.class);

// Use the default configuration.

BasicConfigurator.configure();

// Set the logger level to Level.INFO

logger.setLevel(Level.INFO);

// This request will be disabled since Level.DEBUG < Level.INFO.

logger.debug("This is debug.");

// These requests will be enabled.

logger.info("This is an info.");
logger.warn("This is a warning.");
logger.error("This is an error.");
logger.fatal("This is a fatal error.");

return;
}
}

关于logger的两点说明

1)用同名参数调用Logger.getLogger(String name)将返回同一个logger的引用。故可以在一个地方配置logger,在另外一个地方获得配置好的logger,而无须相互间传递logger的引用。
2)logger的创建可以按照任意的顺序,即,父logger可以后于子logger被创建。log4j将自动维护logger的继承树。

B2)Appender:日志目的地

每个logger都可以拥有一个或者多个appender,每个appender表示一个日志的输出目的地,比如console或者某个文件。可以使用Logger.addAppender(Appender app)为logger增加一个appender;可以使用Logger.removeAppender(Appender app)为logger移除一个appender。

默认情况下,logger的additive标志被设置为true,表示子logger将继承父logger的所有appenders。该选项可以被重新设置,表示子logger将不再继承父logger的appenders。

root logger拥有目标为system.out的consoleAppender,故默认情况下,所有的logger都将继承该appender。

1)ConsoleAppender:使用用户指定的布局(layout) 输出日志事件到System.out或者 System.err。默认的目标是System.out。

2)DailyRollingFileAppender 扩展FileAppender,因此多个日志文件可以以一个用户选定的频率进行循环日志记录。

3)FileAppender 把日志事件写入一个文件

4)RollingFileAppender 扩展FileAppender备份容量达到一定大小的日志文件。

5)WriterAppender根据用户的选择把日志事件写入到Writer或者OutputStream。

6)SMTPAppender 当特定的日志事件发生时,一般是指发生错误或者重大错误时,发送一封邮件。

7)SocketAppender 给远程日志服务器(通常是网络套接字节点)发送日志事件(LoggingEvent)对象。

8)SocketHubAppender 给远程日志服务器群组(通常是网络套接字节点)发送日志事件(LoggingEvent)对象。

9)SyslogAppender给远程异步日志记录的后台精灵程序(daemon)发送消息。

10)TelnetAppender 一个专用于向只读网络套接字发送消息的log4j appender。

还可以实现 Appender 接口,创建以自己的方式进行日志输出的Appender。

  • ConsoleAppender


ConsoleAppender可以用这种方式创建:

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

创建了一个控制台appender,具有一个默认的PatternLayout。它使用了默认的System.out 输出。

  • FileAppender


FileAppender可以用这种方式创建:

FileAppender appender = null;
try {
appender = new FileAppender(new PatternLayout(),"filename");
} catch(Exception e) {}

上面用到的构造函数:

FileAppender(Layout layout, String filename)
实例化一个FileAppender并且打开变量"filename"指定的文件。

另一个有用的构造函数是:

FileAppender(Layout layout, String filename, boolean append)
实例化一个FileAppender并且打开变量"filename"指定的文件。

这个构造函数还可以选择是否对指定的文件进行追加的方式输出。如果没有指定值,那么默认的方式就是追加。

  • WriterAppender


WriterAppender可以用这种方式创建:

WriterAppender appender = null;
try {
appender = new WriterAppender(new PatternLayout(),new FileOutputStream("filename"));
} catch(Exception e) {}

这个WriterAppender使用的构造函数带有PatternLayout和OutputStream参数,在这种情况下, FileOutputStream用于向一个文件输出。当然,它还具有其他可用的构造函数。

B3)Layout:日志格式化器

每个appender都和一个layout相联系;layout的任务是格式化用户的logging request,appender的任务是把layout格式化好的输出内容送往指定的目的地。

当前,log4j具有三种类型的Layout:

1)HTMLLayout 格式化日志输出为HTML表格。

2)PatternLayout 根据指定的 转换模式格式化日志输出,或者如果没有指定任何转换模式,就使用默认的转换模式。

3)SimpleLayout 以一种非常简单的方式格式化日志输出,它打印级别 Level,然后跟着一个破折号“-“ ,最后才是日志消息

  • SimpleLayout 和 FileAppender


import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.SimpleLayout;
import org.apache.log4j.FileAppender;
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) {}
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");
}
}

  • HTMLLayout和 WriterAppender

import java.io.*;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.HTMLLayout;
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) {}
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");
}
}

  • PatternLayout和 ConsoleAppender


import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.ConsoleAppender;
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");
}
}

注意:

上面B2)和B3)中的代码以及B1)中所有有关配置的代码,在实际的开发中一般是不需要,可以通过配置文件搞定,这样也便于维护,上面的例子主要用于理解

未完,待续.....

关于配置文件见下一篇


        

       
分享到:
评论

相关推荐

    apache-log4j-2.8.2-bin.tar

    5. **异步日志记录**:Log4j 2引入了异步日志记录的概念,通过使用LMAX Disruptor库实现无锁数据结构,提高了日志处理的速度,减少了系统资源的消耗。在2.8.2版本中,这部分可能进行了优化,提供更好的性能。 6. **...

    精通log4j

    本文将深入探讨log4j的核心概念、配置以及实际应用,旨在帮助读者全面掌握这一工具。 一、Log4j基础 1. 组件介绍:Log4j主要由三部分组成——Logger(日志器)、Appender(输出端)和Layout(布局)。Logger负责...

    Log4j笔记 第九章 封装Log4j

    《Log4j笔记 第九章 封装Log4j》 ...通过封装Log4j,我们可以更有效地管理和使用日志,提高代码的可维护性和项目的整体质量。理解并熟练运用这些知识点,对于提升Java应用程序的调试和维护能力至关重要。

    log4j.jar_java开发包

    本文将深入探讨Log4j的核心概念、配置以及使用方法。 ### 1. Log4j的组成部分 Log4j主要由以下三个组件构成: - **Logger**:日志记录器,是Log4j的核心,负责接收日志消息并将其发送到指定的Appender。 - **...

    log4j优化文件 logging-log4j2-log4j-2.15.0-rc1.tar

    总结,logging-log4j2-log4j-2.15.0-rc1版本在日志性能、安全性和可配置性方面都有所提升,开发者应充分利用其特性,以优化日志管理,提升系统整体效能,并确保数据安全。同时,理解和掌握Log4j2的配置与优化技巧,...

    [Online]log4j_The_Complete_Manual.zip

    《log4j完全手册》是Java开发者不可或缺的参考资料,它深入介绍了如何在Java应用程序中使用log4j这一广泛使用的日志记录框架。log4j是Apache软件基金会开发的一个开源项目,旨在提供灵活且高效的日志记录解决方案。...

    Log4j The Complete Manual.pdf

    ### Log4j完整手册知识点概览 #### 一、Log4j简介与版本说明 - **Log4j**是一款开放源代码的日志记录组件...通过对上述知识点的学习与实践,开发者可以更好地利用Log4j的强大功能,提升应用的整体稳定性和可维护性。

    Log4j分包输出日志

    本文将深入探讨Log4j如何实现分包日志输出,以及在实际应用中如何配置和使用。 首先,我们需要理解Log4j的核心概念。Log4j由三个主要组件构成:Logger(日志器)、Appender(输出器)和Layout(布局)。Logger负责...

    Log4J 2 和 Log4j 的jar 包

    日志级别是Log4j的核心概念之一,包括DEBUG、INFO、WARN、ERROR和FATAL。这些级别定义了日志信息的重要性,开发者可以设置不同的阈值来控制需要记录的日志级别。例如,在生产环境中,我们通常会设置INFO或WARN级别,...

    log4j实例.rar

    在Log4j中,日志级别是非常关键的概念,它们包括:DEBUG、INFO、WARN、ERROR和FATAL。这些级别按严重程度从低到高排序,开发者可以根据实际需求设置不同的日志级别,过滤掉不关心的信息,提高日志的实用性。 1. **...

    Log4j使用手册 日志记录包

    ### Log4j 使用手册知识点详解 #### 一、概述 **Log4j** 是一个用于Java应用程序的日志记录工具,由Apache软件基金会提供。它允许开发者以不同的方式记录日志信息,这些信息对于调试和故障排查非常有用。通过Log4j...

    log4j 2.15.0-rc2 jar包

    3. 安全更新:除了上述直接的修复措施,Log4j 2.15.0-rc2还包含了其他安全相关的改进和更新,以提高整体安全性。 三、Log4j 2.15.0-rc2的核心组件 1. Log4j API:提供了一组接口和抽象类,定义了日志记录的基本...

    apache-log4j-1.2.15.zip

    Apache Log4j是Java平台上的一个著名日志记录框架,它允许开发者在应用程序中嵌入灵活的日志系统。Log4j 1.2.15是该框架的一个较...理解和有效利用Log4j可以帮助开发者优化应用的监控和调试,提高整体的系统管理效率。

    apache-log4j-2.0

    4. **Lookup功能**:Lookup是Log4j 2.0引入的新概念,它允许在配置文件中使用变量,并从系统属性、环境变量、JNDI等来源动态获取值。这增强了配置的灵活性,使得日志配置可以根据运行环境进行适配。 5. **Error ...

    Log4j中文手册

    该手册详细介绍了Log4j的基本概念及其使用方法,适合初学者及进阶用户参考。 #### 1.1 日志记录的重要性 在程序开发过程中,日志记录是非常重要的组成部分。它不仅帮助开发者追踪问题,还能在生产环境中提供有价值...

    log4j的学习笔记

    **Apache Log4j 学习笔记** ...学习Log4j不仅需要理解上述概念,还要实践操作,通过实际项目经验积累对日志管理的深入理解。通过配置和使用Log4j,开发者可以更好地管理和监控他们的应用程序,确保稳定性和可维护性。

    struts+spring+hibernate+log4j+dom4j等源码

    Log4j的升级版Logback通常被认为在性能和特性上更优,但Log4j仍然广泛使用。 5. Dom4j:Dom4j是一个轻量级的Java XML处理库,它可以解析XML文档,创建DOM树,进行XPath查询,甚至修改XML结构。相比于Java内置的DOM...

    log4perl - log4j for Perl-开源

    `log4perl` 是一个专门为 Perl 语言设计的日志记录框架,灵感来源于 Java 平台上的著名日志库 `log4j`。它的核心目标是提供灵活、高效且可扩展的日志处理能力,使得开发者能够方便地控制应用程序中的日志输出,从而...

    LogShowCase:log4j2 MDC (Manufacturing Data Collection 生产数据实时采集和分析)

    LOG4J2的MDC应用MDC的概念:Manufacturing Data Collection 生产数据实时采集和分析。有时实际开发过程没有发现的BUG在生产环境才出现,需要到生产环境去分析实时日志来进行BUG跟踪;LOG4J2提供了MDC功能可以将特定...

    jar 包hibernate-distribution-3.3.2 slf4j-1.5.8.zip

    4. SLF4J的基本概念:学习如何在代码中插入日志语句,以及如何配置日志输出格式和级别。 5. 日志绑定:了解如何在项目中引入并配置特定的日志实现,如Logback或Log4j。 总之,Hibernate和SLF4J都是Java开发中不可或...

Global site tag (gtag.js) - Google Analytics