`
ghl116
  • 浏览: 163330 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

(转)如何自建appender扩展Log4j框架

阅读更多

 


2007-11-03 20:29:48
标签:Log4j appender
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://zhangjunhd.blog.51cto.com/113473/48895
本文介绍如何在应用中自建日志模块
author: ZJ 07-11-3
 1log4j 概述
log4j 环境包括三个主要组件:
logger(日志记录器):控制要启用或禁用哪些日志记录语句。可以对日志记录器指定如下级别: ALL  DEBUG INFO  WARN  ERROR , FATAL 
layout(布局):根据用户的愿望格式化日志记录请求。
appender:向目的地发送格式化的输出。
2.理解 appender
log4j 框架允许向任何日志记录器附加多个 appender。可以在任何时候对某个日子记录器添加(或删除)appender。附随 log4j 分发的 appender 有多个,包括:
ConsoleAppender;FileAppender;SMTPAppender ;JDBCAppender;JMSAppender;NTEventLogAppender;SyslogAppender
也可以创建自己的自定义 appender
3.本工程设计的目标
通过自建appender类,来实现:
[1]在控制台输出日志;
[2]log文件输出日志;
[3]在应用程序中建立日志模块(在UI层表现为建立一个日志面板),输出日志;
[4]对于不同包路径下的日志独立输出(在UI层表现为分不同的面板输出)。
4.预备知识
你可以在下面2篇文章中找到Log4j的相关基础介绍。
5.项目文件分布与效果
文件分布如图一所示。我们对于com.log.one包下的所有java文件中的日志信息输出到log one模块(图二);对于com.log.two包下的所有java文件中的日志信息输出到log two模块(图四)。本文只象征性的建立了两个测试文件,分别放在两个包下。
com.log.one.LogTestOne.java
public class LogTestOne {
    private final static Logger log = Logger.getLogger(LogTestOne.class);
    public void doLog(){
       log.debug("TestOne debug");
       log.info("TestOne info");
       log.warn("TestOne warn");
       log.error("TestOne error");
       log.fatal("TestOne fatal");
    }
}
 
com.log.two.LogTestTwo.java
public class LogTestTwo {
    private final static Logger log = Logger.getLogger(LogTestTwo.class);
    public void doLog() {
       log.debug("TestTwo debug");
       log.info("TestTwo info");
       log.warn("TestTwo warn");
       log.error("TestTwo error");
       log.fatal("TestTwo fatal");
    }
}
 
图一
 
对于应用程序中的日志模块,提供一些UI层的基本操作,包括清空(图二,图四);变灰(图三);复制到粘贴板。
The Main Text象征性的表示主应用程序的所有操作。
图二
 
图三
 
图四
 
同时在控制台输出所有日志信息。(图五)
图五
 
    同时在文本文件中输出所有日志信息。(图六)
图六
6log4j.xml
本项目使用如下日志配置文件,将其放在项目的classpath下。
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"debug="false"> 
   <!-- =================== -->
   <!-- Appenders           -->
   <!-- =================== -->
   <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
      <errorHandler class="org.apache.log4j.helpers.OnlyOnceErrorHandler"/>
      <param name="Target" value="System.out"/>
      <param name="Threshold" value="DEBUG"/>
      <layout class="org.apache.log4j.PatternLayout">
         <!-- The default pattern: Date Priority [Category] Message\n -->
         <param name="ConversionPattern" value="%-5p %l%m%n"/>
      </layout>
   </appender>
 
   <appender name="FILE" class="org.apache.log4j.RollingFileAppender">
     <errorHandler class="org.apache.log4j.helpers.OnlyOnceErrorHandler"/>
     <param name="File" value="logui.log"/>
     <param name="Threshold" value="INFO"/>
     <param name="Append" value="false"/>
     <param name="MaxFileSize" value="5000KB"/>
     <param name="MaxBackupIndex" value="50"/>
     <layout class="org.apache.log4j.PatternLayout">
       <param name="ConversionPattern" value="%d %-5p [%c{1}] %m%n"/>
     </layout>    
   </appender>
     
   <appender name="ONE" class="com.log.utils.LogOneAppender">
      <errorHandler class="org.apache.log4j.helpers.OnlyOnceErrorHandler"/>
   </appender>
  
    <appender name="TWO" class="com.log.utils.LogTwoAppender">
      <errorHandler class="org.apache.log4j.helpers.OnlyOnceErrorHandler"/>
   </appender>
  
   <!-- =============== -->
   <!-- Loggers         -->
   <!-- =============== -->
   <logger name="com.log.one">
     <level value="DEBUG" />
     <appender-ref ref="ONE"/>
     <appender-ref ref="CONSOLE"/>
   </logger>
  
    <logger name="com.log.two">
     <level value="DEBUG" />
     <appender-ref ref="TWO"/>
     <appender-ref ref="CONSOLE"/>
   </logger>
  
   <root>
      <priority value="INFO" />
      <appender-ref ref="FILE"/>
   </root>
</log4j:configuration>
这里除常规的CONSOLEFILE appender,增加两个appenderONETWO,分别通过自建类LogOneAppenderLogTwoAppender定义。
public class LogOneAppender extends AppenderSkeleton{
    public LogOneAppender() {}
    protected void append(LoggingEvent event) {
       LogUI.log(event);
    }
    public void close() {}
    public boolean requiresLayout() {
       return false;
    }
}
 
public class LogTwoAppender extends AppenderSkeleton{
    public LogTwoAppender() {}
    protected void append(LoggingEvent event) {
       LogUI.log(event);
    }
    public void close() {}
    public boolean requiresLayout() {
       return false;
    }
}
logger中通过logger name,com.log.onecom.log.two指定到上述的appender
7.主界面设计LogUI.java
主面板为frame,其中嵌入LogPanellog类的实体是一个Log4Jmonitor类的实例,通过它的addLogArea方法可以添加日志模块,其中的第二个参数对应log4j配置文件中的logger name。这里还提供一个Cache功能,即如果在主类(LogUI)或日志类(Log4Jmonitor)还没有实例化之前,已经有日志信息,则进行缓存。
public class LogUI {
    private static LogUI instance;
    private static JFrame frame;
    private Log4JMonitor logMonitor;
    private static List<Object> logCache = new ArrayList<Object>();
    public LogUI() {
       instance = this;
    }
    ///////////////////////UI
    private void buildUI() {
       frame.addWindowListener(new WindowAdapter() {
           public void windowClosing(WindowEvent e) {
              System.exit(0);
           }
       });
       frame.getContentPane().add(buildContentPanel(), BorderLayout.CENTER);
       frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
       frame.setSize(100, 75);
    }
 
    private Component buildContentPanel() {
       JSplitPane contentSplit = new JSplitPane();
       contentSplit.setTopComponent(new JTextArea("The Main Text"));
       contentSplit.setBottomComponent(buildLogPanel());
       contentSplit.setDividerLocation(550);
       contentSplit.setResizeWeight(1);
       return contentSplit;
    }
 
    private Component buildLogPanel() {
       logMonitor = new Log4JMonitor();
       logMonitor.addLogArea("log one""com.log.one"true).setLevel(
              Level.DEBUG);
       logMonitor.addLogArea("log two""com.log.two"true).setLevel(
              Level.DEBUG);
       for (Object message : logCache) {
           logMonitor.logEvent(message);
       }
       return logMonitor;
    }
 
    public void show() {
       buildUI();
       frame.setVisible(true);
    }
    ////////////////////Log
    public static synchronized void log(final Object msg) {
       if (instance == null || instance.logMonitor == null) {
           logCache.add(msg);
           return;
       }
       if (SwingUtilities.isEventDispatchThread()) {
           instance.logMonitor.logEvent(msg);
       else {
           SwingUtilities.invokeLater(new Runnable() {
              public void run() {
                  instance.logMonitor.logEvent(msg);
              }
           });
       }
    }
    //////////////////Test Cases
    public void doTests(){
       LogTestOne one=new LogTestOne();
       one.doLog();
       LogTestTwo two=new LogTestTwo();
       two.doLog();
    }
   
    public static void main(String[] args) throws Exception {
       frame = new JFrame("LogUI ");
       LogUI logUi = new LogUI();
       logUi.show();
       logUi.doTests();
    }
}
8log类的实体Log4Jmonitor
通过此类来建立日志模块。其中用到的JlogList.java(见附件)提供对日志模块的所有基本功能。addLogArea方法增加日志模块。logEvent方法对输出的日志事件类型做出判断,对该日志所属的日志模块(本实例为com.log.onecom.log.two)做出判断。
public class Log4JMonitor extends JTabbedPane {
    private JLogList defaultLogArea;
    public Log4JMonitor() {
       super(JTabbedPane.BOTTOM, JTabbedPane.SCROLL_TAB_LAYOUT);
    }
    public JLogList addLogArea(String title, String loggerName,
           boolean isDefault) {
       JLogList logArea = new JLogList(title);
       logArea.addLogger(loggerName, !isDefault);
       addTab(title, logArea);
       if (isDefault)
           defaultLogArea = logArea;
       return logArea;
    }
    public void logEvent(Object msg) {
       if (msg instanceof LoggingEvent) {
           LoggingEvent event = (LoggingEvent) msg;
           String loggerName = event.getLoggerName();
           for (int c = 0; c < getTabCount(); c++) {
              Component tabComponent = getComponentAt(c);
              if (tabComponent instanceof JLogList) {
                  JLogList logArea = (JLogList) tabComponent;
                  if (logArea.monitors(loggerName)) {
                     logArea.addLine(msg);
                  }
              }
           }
       else if (defaultLogArea != null) {
           defaultLogArea.addLine(msg);
       }
    }
    public boolean hasLogArea(String loggerName) {
       for (int c = 0; c < getTabCount(); c++) {
           Component tabComponent = getComponentAt(c);
           if (tabComponent instanceof JLogList) {
              JLogList logArea = (JLogList) tabComponent;
              if (logArea.monitors(loggerName)) {
                  return true;
              }
           }
       }
       return false;
    }
}
 

本文出自 “子 孑” 博客,请务必保留此出处http://zhangjunhd.blog.51cto.com/113473/48895

分享到:
评论

相关推荐

    log4j实用配置扩展

    ### log4j实用配置扩展 #### 一、log4j简介与重要性 Log4j是一种广泛使用的开源日志框架,由Apache软件基金会维护。它主要用于记录Java应用程序的运行时信息,帮助开发者追踪应用程序的行为、调试问题以及进行性能...

    log4j乱码问题解决办法

    Log4j作为一款广泛使用的Java日志框架,在很多项目中扮演着重要角色。然而,在使用过程中可能会遇到字符编码的问题,特别是中文乱码的情况,这不仅会影响日志的可读性,还可能导致难以追踪的问题。本文将详细介绍...

    Log4j2简介及与Log4j效率对比

    4. **插件式架构**:Log4j2采用了插件式的软件架构,这使得框架易于扩展而无需修改其核心代码。这种设计遵循了“对修改封闭,对扩展开放”的原则,增强了框架的灵活性。 5. **简化配置**:Log4j2配置文件更加简洁易...

    log4j日志框架

    **Log4j日志框架详解** Log4j是Apache组织开发的一个开源的日志记录框架,广泛应用于Java应用程序中。作为一款强大的日志处理工具,它提供了灵活的日志配置,允许开发者根据需求调整日志级别、格式和输出位置,极大...

    log4j-api-2.12.4.ja和log4j-core-2.12.4.jar

    **log4j-api-2.12.4.jar** 是Log4j 2框架的API模块,它包含了日志记录的基本接口和类,如`Logger`, `Level`, `Appender`, `Layout`等。这些接口和类为应用程序提供了一种与具体实现解耦的方式来进行日志记录。开发者...

    java中log4j的扩展写法

    ### Java中Log4j的扩展写法 #### 一、引言 在Java开发中,日志记录是一项非常重要的功能,它有助于跟踪程序运行时的状态并帮助开发者进行问题定位和性能优化。Log4j作为一款优秀的日志管理工具,被广泛应用于各种...

    log4j-api-2.17.1.jar和log4j-core-2.17.1.jar

    总的来说,log4j-api-2.17.1.jar和log4j-core-2.17.1.jar是Log4j2的核心组件,它们共同构建了一个强大且可扩展的日志框架。开发者应熟悉这两个库的职责和交互方式,以便充分利用Log4j2的功能,同时确保系统的安全性...

    log4j示例项目

    **日志框架Log4j详解** Log4j是一款广泛使用的Java日志框架,它为应用程序提供了灵活的日志记录功能。这个“log4j示例项目”旨在帮助开发者理解和使用Log4j,通过该项目,我们可以深入学习Log4j的配置、使用方法...

    Log4J完整说明和配置

    ### Log4J完整说明与配置解析 #### 一、Log4J简介 Log4J是Apache的一个开源项目,用于提供灵活的...此外,Log4J还提供了丰富的扩展机制,如MDC(Mapped Diagnostic Context)等功能,进一步增强了其灵活性和适应性。

    log4j-API-最新稳定版本log4j-1.2.17

    10. **可扩展性**:Log4j API允许开发者通过插件机制轻松添加新的appender、filter和layout。 总的来说,Log4j API为Java开发者提供了一个强大而灵活的日志解决方案,通过其丰富的功能和可定制性,能够适应各种项目...

    log4j注释文档

    `log4j`是一款非常流行的Java日志框架,它能够帮助开发者记录程序运行时的信息,从而便于后续的问题追踪与调试。本文档旨在对一份log4j配置文件进行详细解读,以便初学者能够快速掌握其配置方法。 #### 二、配置...

    Spring MVC 框架 整合log4j

    Log4j,则是Java领域广泛使用的日志记录框架,它提供了灵活的日志配置、多级别的日志输出以及多种输出格式,使得开发者可以方便地进行调试和问题追踪。将Spring MVC与Log4j整合,能够帮助我们在开发过程中更好地监控...

    log4j.jar包,和log4j.properties配置文件下载

    Log4j是一个广泛使用的Java日志记录框架,它允许开发者在应用程序中插入日志语句,以便跟踪程序的运行情况、调试错误、监控性能等。这个框架由Apache软件基金会开发,是许多Java项目的首选日志解决方案,因为它具有...

    log4j使用jar包和log4j.properties配置文件

    Log4j是Apache组织提供的一款广泛使用的Java日志框架,因其灵活性、高效性和可扩展性而备受青睐。本文将详细探讨Log4j的使用,主要关注1.2.17版本的jar包以及配置文件`log4j.properties`。 ### 1. Log4j简介 Log4j...

    logging-log4j2-log4j-2.15.0-rc2.zip

    Log4j,作为Java领域广泛使用的日志记录框架,一直以来都是开发者们的重要工具。这次我们关注的是其最新版本——logging-log4j2-log4j-2.15.0-rc2。这个版本在安全性和性能上都做了进一步的优化和提升,旨在为开发者...

    log4j.1.2.17

    log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ``` 上述配置表示创建一个名为FILE的FileAppender,将日志输出到...

    log4j2所需的jar

    Log4j2是Java日志记录框架的一个著名版本,它为开发者提供了强大的日志管理和分析功能。这个压缩包“apache-log4j-2.13.2-bin”包含了Log4j2的核心组件,使得开发者可以在他们的应用程序中集成并使用Log4j2。以下是...

    log4j.properties 的使用详解(含log4j.properties)

    log4j是Apache组织提供的一款开源日志框架,它具有可配置性、可扩展性和高性能的特点。log4j的核心组件包括Appender(输出目的地)、Layout(格式化输出)和Logger(日志级别控制)。在log4j.properties配置文件中,...

    kafka_Java_Log4j

    Log4j是一个广泛使用的日志记录框架,而Apache Kafka则是一个分布式流处理平台,常用于实时数据传输。当我们需要将Log4j的日志实时地发送到Kafka时,可以借助Kafka提供的Log4jAppender实现这一功能。现在,我们详细...

Global site tag (gtag.js) - Google Analytics