Java 的调试包






4.20/5 (5投票s)
用于 Java 应用程序和小程序的调试类。
引言
在调试应用程序时,拥有一个调试框架来控制生成的输出量通常很有用。
此类不具备 Java(TM) 1.4 版本中的 java.util.logging
包的扩展性。 如果您需要更丰富功能的日志记录工具,我建议您使用 java.util.logging
包提供的工具。
背景
当我开始真正使用 Java 时,是为了学习 Java。 我通常不在日常工作中使用 Java,但希望精通它。 由于我试图了解 Java 应用程序和小程序内部的工作方式,我需要一种打印调试信息的方法。 我提出了 com.rl.debug
包。 在编写这个包后不久,我发现了 Java 1.4.x 版本中的 java.util.logging
包。
Debug
类是 com.rl.debug
包的一部分,它遵循一种简单的“分层”日志记录方法。 每个调试消息都被分配一个级别。 根据消息的级别和调试类中设置的当前日志记录级别,该消息可能会或可能不会被输出。 所有符合当前日志记录级别或更高级别的消息都会被记录。
Debug 与 java.util.logging
由于当前 1.4.x 版本的 Java 在 java.util.logging
包中包含一个非常强大且可扩展的日志记录框架,那么为什么要使用其他任何东西呢? 问得好。 以下是我认为可以帮助开发人员做出选择的一些要点。
java.util.logging
包自 1.4 版本开始可用。 如果您的应用程序是使用较低版本构建的,则您无法使用它。 那时您别无选择,只能采用您自己的日志记录包。- 我在
java.util.logging
包中发现的一个有点烦人的限制是,默认情况下,ConsoleHandler
不会记录低于INFO
的任何内容。 由于Debug
包旨在作为调试工具,并且通常不应输出任何信息,因此我选择默认设置为NONE
级别。 - 当然,与
Debug
包相比,java.util.logging
包的灵活性和可扩展性要好得多。 但是,如果您想要一个简单、轻量级的包用于调试,则实现它可能会有点复杂。
我相信可以给出许多其他关于这两个包的论据。 我认为这里提出的这些足以显示每个包的价值,并为决定哪个包适合您自己的项目提供良好的基础。
使用代码
要使用 Debug
类,您需要引用单例实例。 您可以使用 getLogger()
方法获取它。
获取 Debug
类的实例。
// Obtain an instance of the default logger
private static Debug log = Debug.getLogger();
// Obtain a named logger
private static Debug namedLog = Debug.getLogger("LogFile");
您可以使用 setLevel()
方法设置 Debug
类输出的详细程度。 以下代码将记录 WARNING
或更高级别的消息。
// Set the debug level to WARNINGS or higher.
log.setLevel(log.WARNING);
默认情况下,所有消息都记录到 System.err
打印流。 可以使用 setPrintStream
方法更改此设置。
import com.rl.debug.*;
import java.io.*;
public class TestDebug {
public static void main(String argv[]) {
FileOutputStream logFile = null;
PrintStream p = System.out;
try {
logFile = new FileOutputStream("TestDebug.log", true);
p = new PrintStream((OutputStream)logFile, true);
} catch (Exception e)
{
}
Debug log = Debug.getLogger();
Debug logger = Debug.getLogger("LogFile");
logger.setPrintStream(p);
log.setLevel(DebugLevel.ALL);
logger.setLevel(DebugLevel.WARNING);
log.DebugOut("We be a log!");
logger.DebugOut("We be a logger!");
log.DebugOut("I be saying I a logger!");
logger.warning("TestDebug", "main", "This is a warning");
log.setLevel(DebugLevel.WARNING);
log.DebugOut("We should not show up.");
logger.DebugOut("We should not be loggered");
log.DebugOut("I said, no output!");
logger.warning("TestDebug", "main",
"This is a warning with a WARNGING level.");
}
}
以上示例应该足以让您开始。 我建议您阅读代码中的注释。 这些注释应该足以解释如何使用特定功能。 当然,我以前也听过这种说法。 :)
我必须警告您,我没有测试此类是否是线程安全的,因此请将其视为不安全。
祝您编码愉快。
计划增强功能
理想情况下,为输出消息提供您自己的自定义格式会很好。 我考虑过实现这一点,将来可能会实现。 但是,如果您真的需要这种灵活性,您可能应该只使用 java.util.logging
包。 也许,如果我得到一些反馈并且感觉到人们确实需要格式化,我会实现它。 目前,我认为该代码的功能已足够。
历史
- 2003.03.13 - v1.3
在考虑了一段时间后,我意识到我有很多静态项是不需要的。 我修改了它,以便私有成员不再是静态的,唯一的静态方法是
getLogger
方法。完成此操作后,我意识到将应用程序中的某些信息记录到控制台,而将其他信息记录到文件中会很好。 一旦我使私有成员不是静态的,这是可能的,但前提是我有多个
Debug
实例。 这将允许我在一个实例上设置PrintStream
,而不会影响另一个实例。 为了方便起见,我删除了类成员m_logger
并添加了类成员m_loggers
。m_loggers
是记录器的哈希表。 这使得记录器可以在类级别访问,并防止现有应用程序崩溃。 它现在还允许您维护多个记录器。 我更新了示例代码以反映新版本。