在重新发明轮子之前 - 我希望能够在我的代码中插入调试跟踪,例如say("We are here.");
,而不必在每个类中定义static void say()
。它需要执行System.out.println(s)
,并且要全局开启或关闭(doSay(false)
),我也希望它能够识别调用它的类({{3} })。例如:
MyClass:我们在这里。
Java是否已经有这样的工具?
答案 0 :(得分:3)
使用SLF4j,而不是log4j(至少不是直接)。它们都是由same author,CekiGülcü创建的,但SLF4J结合了使用log4j所获得的知识,并研究了其他日志包的进展。
SLF4J是许多不同底层日志记录系统的通用API,例如log4j,java.util.logging
包等。它还有自己的“本机”实现,即logback。
我比log4j更喜欢它的一个原因是它支持消息模板。这些keep your code simpler.
此外,它允许我在库中包含日志记录,但让我的库的用户选择日志记录实现。如果没有这样的东西,用户可能不得不为我的库配置日志记录,并且它不会与其他应用程序统一。
答案 1 :(得分:1)
答案 2 :(得分:1)
是。它被称为日志框架。 Java有java.util.logging
。但许多人更喜欢使用Log4J。
答案 3 :(得分:0)
您可以使用像Apache Log4J这样的记录器,并执行logger.trace("We are here");
之类的操作。如果要关闭此功能,请在配置中将日志级别设置得更高(调试,警告,错误),trace
日志将消失。
答案 4 :(得分:0)
Java具有更高级的日志记录工具,如log4j或logback。在那里你应该创建一个public static final Logger logger = Logger.getLogger(..)
并使用记录器将调试/信息/警告/错误消息写入你喜欢的任何地方。它们具有高度可配置性 - 记录的内容和位置。
对于更简单的情况(如果这是一个玩具项目),您只需使用public static void log(..)
方法定义一个类,并在每个类中使用它。
答案 5 :(得分:0)
为什么不在Main.java中静态声明一个函数,并使用它allround?
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); }
}
请告诉我这是否符合您的需求。
编辑:修改了代码
答案 6 :(得分:0)
我不知道静态导入!我将@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.");
完全符合我的需求。