`
only_java
  • 浏览: 112420 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

使用高效的日志工具—Log4J (2)

阅读更多

转自:http://www.cnblogs.com/SGSoft/articles/84096.html

 

 Log4J的配置

现在来看log4j.properties配置文件的意义。第一行指定了根Logger的级别是DEBUG,并将此指定输出到A1。A1 就是第二行定义的org.apache.log4j.ConsoleAppender,此行表示将A1输出到控制台。第三行规定了输出到A1的格式为 org.apache.log4j.PatternLayout。第四行规定了输出到A1格式的转换模式为 org.javaresearch.log4j.TestLog4J。

很多成熟的服务器类的软件日志信息会输出到控制台,同时输出到日志文件备查。使用Log4J可以在不改变任何代码的情况下,仅通过修改配置文件就可以轻松地完成这项功能。相关配置文件如下:

#### Use two appenders, one to log to console, another to log to a file
log4j.rootCategory=debug, stdout, R

# Print only messages of priority WARN or higher for your category
log4j.category.your.category.name=WARN

#### First appender writes to console
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

#### Second appender writes to a file
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log

# Control the maximum log file size
log4j.appender.R.MaxFileSize=100KB
# Archive log files (one backup file here)
log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n


这个配置文件指定了两个输出源stdout和R。前者把日志信息输出到控制台,后者是一个轮转日志文件。最大的文件是100KB,当一个日志文件 达到最大尺寸时,Log4J会自动把example.log重命名为example.log.1,然后重建一个新的example.log文件,依次轮 转。

在Web应用中使用

在Web应用中,应该在哪儿对Log4J进行配置呢?首先要明确,Log4J必须在应用的其它代码执行前完成初始化。因为Servlet 是在Web服务器启动时立即装入的,所以,在Web应用中一般使用一个专门的Servlet来完成Log4J的配置,并保证在web.xml的配置中,这 个Servlet位于其它Servlet之前。下面是一个例子,代码如下:

package org.javaresearch.log4j;
import java.io.*;
import javax.servlet.*;
import org.apache.log4j.*;
public class Log4JInit extends HttpServlet {
 public void init() throws ServletException {
  String prefix = getServletContext().getRealPath("/");
  String file = getServletConfig().getInitParameter("log4j-config-file");
  // 从Servlet参数读取log4j的配置文件 
  if (file != null) {
   PropertyConfigurator.configure(prefix + file);
  }
 }
 public void doGet(HttpServletRequest request,HttpServletResponse response)throws 
IOException, ServletException {}
 public void doPost(HttpServletRequest request,HttpServletResponse response)throws 
IOException, ServletException {}
}


<servlet>
  <servlet-name>log4jinit</servlet-name> 
   <servlet-class>org.javaresearch. log4j.Log4JInit</servlet-class>              
   <init-param>
   <param-name> log4j-config-file </param-name> 
      <param-value>/properties/log4j.properties</param-value> 
   </init-param>
   <load-on-startup>1</load-on-startup>
  </servlet>


注意:上面的load-on-startup应设为1,以便在Web容器启动时即装入该Servlet。log4j.properties文件放在根的properties子目录中,也可以把它放在其它目录中。应该把.properties文件集中存放,这样方便管理。

高级话题

性能

在记录一些日志信息时,会一定程度地影响系统的运行效率,这时日志工具是否高效就是一个关键。Log4J的首要设计目标就是高效,一些关键组件都 重写过很多次以不断提高性能。根据Log4J项目小组的报告,在AMD Duron 800MHz + JDK1.3.1的环境下,Log4J判断一条日志语句是否需要输出仅需要5纳秒。实际的日志语句执行的也非常快速,从使用SimpleLayout的 21微秒(几乎与System.out.println一样快),到使用TTCCLayout的37微秒不等。

嵌套诊断环境NDC

在多用户并发的环境下,通常是由不同的线程分别处理不同的客户端请求。此时要在日志信息中区分出不同的客户端,你可以为每一个线程生成一个 Logger,从而从一堆日志信息中区分出哪些信息是属于哪个线程的,但这种方式并不高效。Log4J巧妙地使用了Neil Harrison提出的“NDC(嵌套诊断环境)”机制来解决这个问题。Log4J为同一类别的线程生成一个Logger,多个线程共享使用,而它仅在日 志信息中添加能够区分不同线程的信息。NDC是什么?举例来说,如果一个Servlet接到并发请求时,为每一个客户端创建一个新的线程,然后分配一个用 于保存该请求上下文的NDC堆栈。该上下文可能是发出请求的主机名、IP地址或其它任何可以用于标识该请求的信息。这样,由于不同的客户端处理线程具有不 同的NDC堆栈,即使这个Servlet同时生成多个线程处理不同的请求,这些日志信息仍然可以区分出来,就好像Log4J为每一个线程都单独生成了一个 Logger实例一样。在Log4J中是通过org.apache.log4j.NDC实现这种机制的。使用NDC的方法也很简单,步骤如下:

1. 在进入一个环境时调用NDC.push(String),然后创建一个NDC;

2. 所做的日志操作输出中包括了NDC的信息;

3. 离开该环境时调用NDC.pop方法;

4. 当从一个线程中退出时调用NDC.remove方法,以便释放资源。

下面是一个模拟记录来自不同客户端请求事件的例子,代码如下:

import org.apache.log4j.Logger;
import org.apache.log4j.NDC;
public class TestNDC {
 static Logger log = Logger.getLogger(TestNDC.class.getName());
 public static void main(String[] args) {
  log.info("Make sure %x is in your layout pattern!");
  // 从客户端获得IP地址的例子
  String[] ips = {"192.168.0.10","192.168.0.27"};
  for (int i = 0; i<ips.length ; i++)  // 模拟一个运行方法
  {
   // 将IP放进 NDC中
   NDC.push(ips[i]);
   log.info("A NEW client connected, who's ip should appear in this log message.");
   NDC.pop();
  }
  NDC.remove();
  log.info("Finished.");
 }
}


注意配置文件中的布局格式中一定要加上%x。系统输出如下:

INFO   - Make sure %x is in your layout pattern!
INFO  192.168.0.10 - A NEW client connected, who's ip should appear in this log 
message.
INFO  192.168.0.27 - A NEW client connected, who's ip should appear in this log 
message.
INFO   - Finished.


使用Log4J还是JDK logging API

从JDK 1.4.0开始,引入了java.util.logging包。虽然Log4J小组曾竭力游说JCP(Java Community Process)采用Log4J作为JDK 1.4的“标准”日志API,虽然最终因Sun的日志API规范的负责人Graham Hamilton的一句“Merlin的开发已经到了最后阶段,这时不允许再对主要API做出改变”而没有被采纳,但Log4J还是对新的日志API产生 了重要影响。那么,我们到底应该采用Log4J还是java.util.logging包呢?下面仅对两者做一简单的比较。

1. Log4J更加成熟,从1999年10月开始至今已经有3年的时间,并且已经在许多项目中有着成熟的应用。而JDK中的logging包是在1.4之后才 引入的,并且不能运行于JDK 1.3之前的版本。Log4J则可以良好地运行于JDK 1.1之后的所有版本。

2. Log4J已经被移植到多种环境下,包括log4c(C)、log4cpp(C++)、log4perl(Perl)、log4net(.net)等。在这些环境下,可以感受到几乎一致的配置和使用方式。这是JDK中的logging API所不能比拟的。

3. Log4J还具有更加强力的格式化系统,可以使记录输出时实现简单的模式。但是,它不会增加类而导致格式化工具的扩展。众多的附加程序和处理器使得Log4J数据包成为一个绝佳的选择,所有你所需要的都可能加以实现。

4. Log4J在性能上做了最大的优化。

Logging API对于简单的使用是足够的,但它缺少了许多Log4J所具有的功能。所以,如果你需要一个强力的logging机制,就应坚持使用Log4J;而如果只是需要一些简单的控制或文件记录,那么可以使用已经内建在JDK之中的logging API。

虽然Log4J和JDK logging API是一种竞争关系,但在logging API还在JCP中讨论(JSR47)时,两者之间就已经开始相互影响了。

分享到:
评论

相关推荐

    使用log4j2实现日志数据脱敏

    Log4j2作为Java领域广泛使用的日志框架,提供了丰富的功能来满足这一需求。本文将详细介绍如何使用Log4j2实现日志数据脱敏。 一、Log4j2简介 Log4j2是Apache软件基金会开发的日志框架Log4j的升级版,它具有更高的...

    \使用高效的日志工具—log4j详细教程

    使用高效的日志工具—Log4J Log4J是Apache软件基金会Jakarta项目下的一个子项目,是用 Java编写的优秀日志工具包。通过Log4J可以在不修改代码的情况下,方便、灵活地控制任意粒度的日志信息的开启或关闭,然后使用...

    使用高效的日志工具—Log4J

    Log4J是一个高效且功能强大的日志工具,它属于Apache软件基金会Jakarta项目的一部分,主要由Java编写。在编程过程中,日志操作是必不可少的,包括调试信息的记录、运行时的日志跟踪以及审计功能。据统计,日志相关的...

    Java 日志工具 Log4j 示例源代码

    Java日志工具Log4j是Java开发者非常熟悉的一个开源日志框架,它为应用程序提供了灵活且高效的日志记录功能。Log4j不仅简单易用,而且功能强大,能够帮助开发者在开发、测试和生产环境中方便地收集和分析日志信息。...

    tomcat8更换log4j记录日志

    2. 如果Tomcat中已经包含了其他日志库,可能需要将Log4j的JAR文件(如`log4j.jar`)添加到`lib`目录,以确保优先使用Log4j。 3. 在Tomcat的`web.xml`配置文件中,可能需要配置一个`ContextLoaderListener`,以确保在...

    配置Log4j的详细最好的日志工具

    ### 配置Log4j的详细指南:最佳的日志管理工具 #### 一、引言 在软件开发过程中,良好的日志记录对于调试、维护和性能优化等方面具有至关重要的作用。Log4j作为Apache下的一个开源项目,因其高度灵活性、易配置性...

    日志 log4j

    总结,Log4j作为一款强大且灵活的日志工具,不仅能够帮助开发者调试代码,还能在生产环境中提供关键的运行日志,是Java开发中的必备组件。掌握其使用和配置,对于提高开发效率和问题排查能力具有重要意义。通过实践...

    log4j记录Debug日志

    在使用Log4j记录Debug日志时,确保项目中引入了相应的Log4j库,并正确配置了`log4j.properties`或`log4j.xml`文件,设置DEBUG级别,然后在代码中使用Logger对象进行日志记录。例如: ```java import org.apache.log4...

    在web应用中使用日志工具log4J

    Log4J是Apache组织提供的一款广泛使用的Java日志框架,它具有强大的功能、灵活的配置以及高效的性能。本文将详细介绍如何在Web应用中集成和使用Log4J。 1. **Log4J的基本概念** - **Logger**:日志记录器,是Log4J...

    logging-log4j2-log4j-2.15.0-rc2.zip

    总之,logging-log4j2-log4j-2.15.0-rc2版本不仅在安全性上达到了新的高度,还通过一系列改进和优化,确保了日志处理的高效性和灵活性。对于开发者来说,深入理解和掌握这一版本的Log4j,将有助于构建更加健壮、安全...

    log4j使用教程(详解)

    虽然Log4j非常流行,但随着技术的发展,出现了许多其他优秀的日志框架,如Logback(由Log4j的作者创建,更高效、更灵活)、SLF4J(Simple Logging Facade for Java,作为日志API,可与其他日志框架集成)。...

    log4j2所需的jar

    7. **异步日志处理**:Log4j2引入了异步日志记录,通过使用LMAX Disruptor库,能够在不阻塞主线程的情况下高效处理日志事件,进一步提高了应用性能。 8. **JMX(Java Management Extensions)**:Log4j2支持JMX,...

    Log4j日志管理

    总之,Log4j作为一款强大的日志工具,为企业级应用提供了一套完善的日志解决方案,无论是调试、监控还是故障排查,都能发挥重要作用。学习和掌握Log4j的使用,对于提升Java开发者的生产力和问题解决能力有着显著的...

    log4j日志包日志包

    `log4j`是由Apache软件基金会开发的一个开源的日志组件,它为Java应用程序提供了一种灵活、高效和可配置的日志记录机制。`log4j`的设计理念是将日志输出与应用程序代码分离,使得日志级别和格式可以根据需要动态调整...

    log4j2所需jar包

    Log4j2是一款广泛使用的Java日志记录框架,它的核心在于提供高效、灵活的日志记录功能,便于开发者在应用程序中追踪错误、调试信息以及性能数据。这个压缩包包含的两个关键文件——`log4j-api-2.11.1.jar`和`log4j-...

    Java与log4j2整合mongoDB需要的jar包

    在Java开发过程中,为了实现日志管理,我们通常会使用如log4j2这样的日志框架。Log4j2是一个强大的、灵活的日志系统,它提供了丰富的配置选项和高性能的日志记录能力。当我们的应用程序需要将日志信息存储在数据库中...

    log4j日志的基本使用

    2. **编写代码**:使用Log4j API来记录日志信息。 ```java import org.apache.log4j.Logger; public class Example { private static final Logger logger = Logger.getLogger(Example.class); public ...

    springboot+mybatis+log4j2

    在项目中,我们需要修改Spring Boot的默认配置,指定使用Log4j2,并在项目的配置文件中(如`log4j2.xml`或`log4j2.json`)定义日志级别、输出格式和目标位置。 在项目中,"springBootMybatis"这个压缩包文件可能...

    log4j.zip 项目日志

    《深入理解Log4j:构建高效日志管理体系》 在软件开发中,日志系统扮演着至关重要的角色,它能够帮助开发者追踪程序运行状态、定位错误、排查问题以及进行性能分析。Log4j,作为Java领域中最流行的日志框架之一,因...

    log4J日志.zip

    Log4j,作为Java平台上的一个开源日志框架,因其高效、灵活和可扩展的特性,被广泛应用于各种规模的项目中。 **Log4j简介** Log4j是由Apache软件基金会开发的Java日志框架。它允许开发者为应用程序定义不同的日志...

Global site tag (gtag.js) - Google Analytics