0

在我重新发明轮子之前 - 我希望能够在我的代码中插入调试跟踪,例如,而不是在每个类中say("We are here.");定义。static void say()它需要做System.out.println(s),并且要全局打开或关闭(doSay(false)),我还希望它能够识别从中调用它的类(如此处所述)。例如:

MyClass:我们在这里。

Java 是否已经有了这样的工具?

4

7 回答 7

3

使用SLF4j,而不是 log4j(至少,不直接)。它们都是由同一作者Ceki Gülcü 创建的,但 SLF4J 结合了通过查看 log4j 的使用获得的知识,以及查看其他日志记录包的进步。

SLF4J 是许多不同底层日志系统的通用 API,如 log4j、java.util.logging包等。它还有自己的“本机”实现 logback。

我比 log4j 更喜欢它的一个原因是它支持消息模板。这些使您的代码更简单。

此外,它允许我在库中包含日志记录,但让我的库的用户选择日志记录实现。如果没有这样的东西,用户可能必须只为我的库配置日志记录,并且它不会与他的应用程序的其余部分统一。

于 2011-08-04T22:26:14.153 回答
1

最流行的 Java 日志框架是Log4J,它可以做到这一点(以及更多)。

在此处查找其他列表。

于 2011-08-04T22:18:36.120 回答
1

是的。它被称为日志框架。Java 有java.util.logging. 但许多人更喜欢使用Log4J

于 2011-08-04T22:19:24.583 回答
0

您可以使用像 Apache 的Log4J这样的记录器并执行类似logger.trace("We are here");. 当你想关闭它时,在你的配置中设置更高的日志级别(调试、警告、错误),trace日志就会消失。

于 2011-08-04T22:19:54.217 回答
0

Java 有更高级的日志工具,比如 log4j 或 logback。在那里,您应该创建一个public static final Logger logger = Logger.getLogger(..)并使用记录器将调试/信息/警告/错误消息写入您喜欢的任何位置。它们是高度可配置的——记录什么以及在哪里记录。

对于更简单的情况(如果这是一个玩具项目),您可以简单地使用该public static void log(..)方法定义一个类并在每个类中使用它。

于 2011-08-04T22:20:23.360 回答
0

为什么不在 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); }

}

让我知道这是否符合您的需求。

编辑:修改了代码

于 2011-08-04T22:21:17.043 回答
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.");

这完全适合我的需求。

于 2011-08-05T16:12:40.570 回答