2011-08-04 45 views
0

之前我推倒重来 - 我希望能够插入调试的痕迹在我的代码,如say("We are here.");,无需在每一个类中定义static void say()。它需要做System.out.println(s),并且全局开启或关闭(doSay(false)),并且我也希望它能够识别它被调用的类(as described here)。例如:编写调试一个简单的打印方法的Java

MyClass的:我们在这里。

确实的Java已经有了这样的工具吗?

+1

为什么你需要重新定义每个类中的'static'函数?根据定义,'static'函数不需要实例,所以你可以从任何地方调用它们。 –

+0

可能重复的[Java,如何跟踪函数调用](http://stackoverflow.com/questions/4677502/java-how-to-trace-functions-called) – CoolBeans

+0

@Karl:有没有一种方法来定义它我可以在任何地方调用它,比如简单的说(...)或者log(...),而不是'MyUtils.say(...)'? – Chap

回答

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

这完全符合我的需要。

1

最流行的Java日志框架为Log4J它做到这一点(和更多)。

查看here查看其他列表。

0

你可以使用Apache的Log4J一个记录器,并完成类似logger.trace("We are here");。如果希望关闭该功能,请在配置中将日志级别设置得更高(调试,警告,错误),并且日志将会消失。

0

Java具有更高级的日志工具,如log4j或logback。在那里,你应该创建一个public static final Logger logger = Logger.getLogger(..)并使用记录器来编写debug/info/warn/error消息到你喜欢的任何地方。它们是高度可配置的 - 什么和在哪里登录。

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

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); } 

} 

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

编辑:(直接至少,不)订正代码

+0

这实际上是我寻找的那种简单性,除非我做错了什么,静态say()不能引用'这个'。最重要的是,我希望能够从任何地方调用say(),而无需限定;例如Main.say( “东西”);在Java中可能吗? – Chap

+1

'debug'和'setDebug'也可以做成'static'。 –

+0

我更新了代码,以便它不再引用这个上下文(当它是静态的时候,它不是一个聪明的举动)。 – ninetwozero

3

使用SLF4j,不log4j的。它们都是由same author, CekiGülcü创建的,但SLF4J结合了使用log4j所获得的知识,并查看了其他日志软件包中的进展。

SLF4J是许多不同的基础日志记录系统的常用API,如log4j,java.util.logging包等。它也有自己的“原生”实现,即logback。

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

此外,它可以让我包括一个库记录,但让我的图书馆的用户选择日志实现。如果没有这样的事情,用户可能必须为我的库配置日志记录,并且它不会与其他应用程序统一。