Java应用程序的日志框架
我在java中创建了一个小型web应用程序。现在我想将记录功能添加到它。但我不想使用Log4j或其他任何可用的Logging框架,而是想创建自己的日志记录框架,这在将来也是可以消耗的。因此,需要一些初步的推动,同样,这是正确的地方。Java应用程序的日志框架
谢谢。
我的建议是不要这样做。使用久经考验的日志框架,如log4j。你为什么要重新发明轮子?
在现有框架上花费了大量时间 - 使它们在各种不同的环境下快速工作等等。您真的想浪费时间来复制这些工作,因为您可以花费相同时间在用户的功能上关心?
不要忘记,许多框架(如log4j,甚至是内置的java.util.logging)都可以用你自己的格式化器,处理程序等进行扩展。你应该真正搞清楚你想做什么,没有被现有的框架所覆盖,并且看看你是否可以只创建而不是创建另一个日志框架。
如果当你计算出你的需求需要编写一些额外的代码,那么你可以提出有关这些特定需求的问题,而不是你目前相当普遍的问题。
那里已经有太多的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指出,测量是您最好的朋友。
不要重新发明轮子。使用现有的框架。 ;) – Bozho 2010-02-08 11:19:59
好奇你为什么不想使用Log4J或JDK Logger! – 2010-02-08 11:20:09
我在jon的评论中给出了原因 – GuruKulki 2010-02-08 11:25:21