在我重新发明轮子之前 - 我希望能够在我的代码中插入调试跟踪,例如,而不是在每个类中say("We are here.");
定义。static void say()
它需要做System.out.println(s)
,并且要全局打开或关闭(doSay(false)
),我还希望它能够识别从中调用它的类(如此处所述)。例如:
MyClass:我们在这里。
Java 是否已经有了这样的工具?
在我重新发明轮子之前 - 我希望能够在我的代码中插入调试跟踪,例如,而不是在每个类中say("We are here.");
定义。static void say()
它需要做System.out.println(s)
,并且要全局打开或关闭(doSay(false)
),我还希望它能够识别从中调用它的类(如此处所述)。例如:
MyClass:我们在这里。
Java 是否已经有了这样的工具?
使用SLF4j,而不是 log4j(至少,不直接)。它们都是由同一作者Ceki Gülcü 创建的,但 SLF4J 结合了通过查看 log4j 的使用获得的知识,以及查看其他日志记录包的进步。
SLF4J 是许多不同底层日志系统的通用 API,如 log4j、java.util.logging
包等。它还有自己的“本机”实现 logback。
我比 log4j 更喜欢它的一个原因是它支持消息模板。这些使您的代码更简单。
此外,它允许我在库中包含日志记录,但让我的库的用户选择日志记录实现。如果没有这样的东西,用户可能必须只为我的库配置日志记录,并且它不会与他的应用程序的其余部分统一。
是的。它被称为日志框架。Java 有java.util.logging
. 但许多人更喜欢使用Log4J。
您可以使用像 Apache 的Log4J这样的记录器并执行类似logger.trace("We are here");
. 当你想关闭它时,在你的配置中设置更高的日志级别(调试、警告、错误),trace
日志就会消失。
Java 有更高级的日志工具,比如 log4j 或 logback。在那里,您应该创建一个public static final Logger logger = Logger.getLogger(..)
并使用记录器将调试/信息/警告/错误消息写入您喜欢的任何位置。它们是高度可配置的——记录什么以及在哪里记录。
对于更简单的情况(如果这是一个玩具项目),您可以简单地使用该public static void log(..)
方法定义一个类并在每个类中使用它。
为什么不在 Main.java 中静态声明一个函数,并全面使用它?
public class Main {
private static boolean debug;
public static void setDebug(boolean d) { Main.debug = d; }
public static void say(String s) { if(Main.debug) System.out.println(s); }
}
让我知道这是否符合您的需求。
编辑:修改了代码
我不知道静态导入!我结合了 @ninetwozero、@karl 和 @erickson 的想法来创建这个:
package myPkg;
public class CLHUtilities {
private static boolean saying = false;
public static void tracing(boolean b) {
saying = b;
}
/*
* Technique taken from:
* http://stackoverflow.com/questions/282977/which-class-invoked-my-static-method
*/
public static void say(String s) {
if (saying) {
Throwable t = new Throwable();
StackTraceElement[] trace = t.getStackTrace();
String className = trace[1].getClassName();
String whoCalledMe = null;
try {
whoCalledMe = Class.forName(className).getSimpleName();
} catch (Exception e) {
}
System.out.println(whoCalledMe + ": " + s);
}
}
}
可以简单地用作:
import static myPkg.CLHUtilities.*;
:
tracing(true);
:
say("We are here.");
这完全适合我的需求。