Java应用程序的日志框架

问题描述:

我在java中创建了一个小型web应用程序。现在我想将记录功能添加到它。但我不想使用Log4j或其他任何可用的Logging框架,而是想创建自己的日志记录框架,这在将来也是可以消耗的。因此,需要一些初步的推动,同样,这是正确的地方。Java应用程序的日志框架

谢谢。

+14

不要重新发明轮子。使用现有的框架。 ;) – Bozho 2010-02-08 11:19:59

+1

好奇你为什么不想使用Log4J或JDK Logger! – 2010-02-08 11:20:09

+0

我在jon的评论中给出了原因 – GuruKulki 2010-02-08 11:25:21

我的建议是不要这样做。使用久经考验的日志框架,如log4j。你为什么要重新发明轮子?

在现有框架上花费了大量时间 - 使它们在各种不同的环境下快速工作等等。您真的想浪费时间来复制这些工作,因为您可以花费相同时间在用户的功能上关心?

不要忘记,许多框架(如log4j,甚至是内置的java.util.logging)都可以用你自己的格式化器,处理程序等进行扩展。你应该真正搞清楚你想做什么,没有被现有的框架所覆盖,并且看看你是否可以只创建而不是创建另一个日志框架

如果当你计算出你的需求需要编写一些额外的代码,那么你可以提出有关这些特定需求的问题,而不是你目前相当普遍的问题。

+3

+1建议不要重新发明车轮。 – Oded 2010-02-08 11:19:59

+0

谢谢乔恩。但它会对此产生依赖性。我的存储问题有限。所以我想用我的应用程序需要多少,只有那些我会开发。 – GuruKulki 2010-02-08 11:22:48

+5

@gurukulki:如果你开发自己的框架,那也会占用空间。你是多么有限?你总是可以减少你发布的log4j的哪些位 - 或者使用已经存在于JDK中的java.util.logging,所以不会添加新的依赖关系。 – 2010-02-08 11:24:12

那里已经有太多的Java日志框架了。

为什么不把包装内置java.util.logging

http://java.sun.com/j2se/1.4.2/docs/guide/util/logging/overview.html

如果你真的想使自己的日志franmework(我强烈建议你不要),然后先写下一些要求。它应该做什么?它应该有什么特点等等

例子是写多张输出能力 - 文件,控制台,插座,串行端口等

而且多线程的写作 - 你不想多线程在同一写入日志时间,否则你会最终得到垃圾。

日志级别 - 多少?

然后你就可以开始编写代码....而已,至于建议,我不明白为什么你不使用的许多免费可用的日志记录framewroks在那里的一个,,,

这些都是一些陷阱你可能会在尝试创建自己的日志记录框架时陷入:

  • 并发问题:日志框架可能由不同的线程同时访问。您需要确保没有冲突出现,并且消息以正确的顺序记录。
  • 实例化:框架必须实例化一次,然后可用于应用程序的其余部分。你需要一个'Singleton'类,你必须小心执行。使用静态方法是一种方法。
  • 您必须具有使用xml文件或注释的配置机制。
  • 您的框架必须与第三方库合作。我相信这对你来说是一个真正的障碍。你可能有你的代码的日志框架,但你使用的库需要另外一个。

这是一件好事,因为你会意识到为什么你应该使用众多优秀的日志框架之一。在你摆弄这一周之后,回去并使用log4j。

然而,在此之前,并让你开始,这里是一个我刚才只是因为我想要让我的头一轮复杂是什么准备。这对于您的目的而言并不完整,我建议您仅使用它来决定您想要执行的操作,而不是基于您的实现。它应该给你什么是必要的合理的想法,它提供了基本的单线程的日志记录...

/* 
* Created on Jun 11, 2005 
*/ 
package com.hupa.util; 

import java.io.*; 
import java.util.Date; 

/** 
* @author simonpalmer 
*/ 
public class MessageWriter implements ILog 
{ 
    public class e_LogLevel 
    { 
     public static final int e_log_error = 1; 
     public static final int e_log_warn = 2; 
     public static final int e_log_info = 4; 
     public static final int e_log_debug = 8; 
    } 
    public int m_iLogLevel = e_LogLevel.e_log_error; 
    public String m_strLogFile = new String(); 
    public String m_strLogPath = new String(); 
    public boolean m_bConsoleOut = true; 
    PrintStream m_ps; 
    public boolean m_bLogOpen = false; 
    private static Date dt = new Date(); 

    /** 
    * Output info level message 
    * @param strMess 
    */ 
    public void info(String strMess) 
    { 
     if ((m_iLogLevel & e_LogLevel.e_log_info) == e_LogLevel.e_log_info) 
     { 
      dt.setTime(System.currentTimeMillis()); 
      String strOut = dt.toString() + " inf: " + strMess; 
      if (m_bConsoleOut) System.out.println(strOut); 
      if (m_bLogOpen) m_ps.println(strOut); 
     } 
    } 
    public boolean bInfo(){return ((m_iLogLevel & e_LogLevel.e_log_info) == e_LogLevel.e_log_info);} 
    /** 
    * Output debug level message 
    * @param strMess 
    */ 
    public void debug(String strMess) 
    { 
     if ((m_iLogLevel & e_LogLevel.e_log_debug) == e_LogLevel.e_log_debug) 
     { 
      dt.setTime(System.currentTimeMillis()); 
      String strOut = dt.toString() + " dbg: " + strMess; 
      if (m_bConsoleOut) System.out.println(strOut); 
      if (m_bLogOpen) m_ps.println(strOut); 
     } 
    } 
    public boolean bDebug(){return ((m_iLogLevel & e_LogLevel.e_log_debug) == e_LogLevel.e_log_debug);} 
    /** 
    * Output warning level message 
    * @param strMess 
    */ 
    public void warn(String strMess) 
    { 
     if ((m_iLogLevel & e_LogLevel.e_log_warn) == e_LogLevel.e_log_warn) 
     { 
      dt.setTime(System.currentTimeMillis()); 
      String strOut = dt.toString() + " warn: " + strMess; 
      if (m_bConsoleOut) System.out.println(strOut); 
      if (m_bLogOpen) m_ps.println(strOut); 
     } 
    } 
    public boolean bWarn(){return ((m_iLogLevel & e_LogLevel.e_log_warn) == e_LogLevel.e_log_warn);} 
    /** 
    * Output error level message 
    * @param strMess 
    */ 
    public void error(String strMess) 
    { 
     if ((m_iLogLevel & e_LogLevel.e_log_error) == e_LogLevel.e_log_error) 
     { 
      dt.setTime(System.currentTimeMillis()); 
      String strOut = dt.toString() + " err: " + strMess; 
      if (m_bConsoleOut) System.out.println(strOut); 
      if (m_bLogOpen) m_ps.println(strOut); 
     } 
    } 
    public boolean bError(){return ((m_iLogLevel & e_LogLevel.e_log_error) == e_LogLevel.e_log_error);} 

    /** 
    * construst the log file name 
    * @return String, full file path and name 
    */ 
    public String GetLogFileName() 
    { 
     return m_strLogPath + m_strLogFile + ".log"; 
    } 

    /** 
    * Open the log file prescribed by the settings 
    * @return boolean, success 
    */ 
    public boolean OpenLog() 
    { 
     try 
     { 
      m_ps = new PrintStream(new FileOutputStream(GetLogFileName())); 
      m_bLogOpen = true; 
     } 
     catch (FileNotFoundException e) 
     { 
      // this means that the folder doesn't exist 
      if (MakeFolder(m_strLogPath)) 
      { 
       m_bLogOpen = true; 
       try 
       { 
        m_ps = new PrintStream(new FileOutputStream(GetLogFileName())); 
       } 
       catch (IOException e1) 
       { 
        e.printStackTrace(); 
        m_bLogOpen = false; 
       } 
      } 
     } 
     return m_bLogOpen; 
    } 

    public static boolean MakeFolder(String strFolder) 
    { 
     try 
     { 
      java.io.File f = new File(strFolder); 
      if (!f.mkdirs()) 
      { 
       return false; 
      } 
     } 
     catch (SecurityException e) 
     { 
      e.printStackTrace(); 
      return false; 
     } 
     return true; 
    } 

    /** 
    * Close the log file 
    * @return boolean, success 
    */ 
    public boolean CloseLog() 
    { 
     if (m_ps != null) 
     { 
      m_ps.flush(); 
      m_ps.close(); 
     } 
     m_bLogOpen = false; 
     return m_bLogOpen; 
    } 

    public void setConsoleOut(boolean b) 
    { 
     m_bConsoleOut = b; 
    } 
    public void setLogLevel(int i) 
    { 
     m_iLogLevel = i; 
    } 

} 

和这里的接口

public interface ILog 
{ 
    abstract public void debug(String message); 
    abstract public void info(String message); 
    abstract public void warn(String message); 
    abstract public void error(String message); 

    abstract public void setLogLevel(int i); 
    abstract public void setConsoleOut(boolean b); 
    abstract public boolean CloseLog(); 
    abstract public boolean OpenLog(); 

    abstract public boolean bDebug(); 
} 

你想要一个小的内存占用尚未扩展?避免过早优化,然后:尝试log4j或java.util.logging,测量足迹(条件编译),并查看是否真的可以通过滚动自己的分支或分支来实现。除了根据Visage的建议来定义要求,并且还能够解决这些问题的时候,kgiannakakis指出,测量是您最好的朋友。