在Java中编写一个简单的打印方法进行调试

时间:2011-08-04 22:16:16

标签: java debugging logging static-import

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

  

MyClass:我们在这里。

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

7 个答案:

答案 0 :(得分:3)

使用SLF4j,而不是log4j(至少不是直接)。它们都是由same author,CekiGülcü创建的,但SLF4J结合了使用log4j所获得的知识,并研究了其他日志包的进展。

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

我比log4j更喜欢它的一个原因是它支持消息模板。这些keep your code simpler.

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

答案 1 :(得分:1)

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

查看here以获取其他列表。

答案 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.");

完全符合我的需求。