我需要能够在生产中打印到记录器,但在开发时我想打印到控制台。所以在c ++中我会简单地使用一个宏,这将是1行的变化,我怎么能在java中做到这一点? 感谢
答案 0 :(得分:9)
使用良好的日志框架,宏不是正确的答案。查看SLF4J(或更早的log4j)。如果您通过其中一个外观路由所有日志记录调用,您将能够通过一点点配置将记录的消息发送到控制台,文件或任何其他您喜欢的appender。
答案 1 :(得分:4)
Java没有C / C ++ - 就像宏一样,因此没有简单的方法来自动禁用所有日志代码。你能做的就是这样:
public class Utility {
private Utility() {} // Singleton
public static void log(String toLog) {
System.out.println(toLog);
}
/* ... etc. ... */
}
现在,您希望在程序中记录某个事件,只需调用
即可Utility.log("Here's a message!");
在生产版本中,只需将log
的实现更改为无操作即可使此输出静音。
这不如C / C ++那么高效 - 只是让您的日志记录宏在编译时扩展到虚无,但是一个好的优化器/ JIT应该能够注意到该参数没有被使用和优化远离建立这些论点的逻辑。
答案 2 :(得分:3)
答案 3 :(得分:2)
只需定义一个静态方法并调用它。在该方法中,设置一个常量,在调试时设置为true
,并根据您是否正在调试执行不同的代码。
答案 4 :(得分:1)
通常,编写一个函数来读取系统属性以了解要打印到的位置。
或者,对于这种特定情况,使用log4j,它允许您在配置文件中指定这样的东西。
答案 5 :(得分:1)
Java不直接支持预处理器,因此不支持宏。
然而,记录是一种常见需求,因此有多种选择可供选择。目前,最好的方法是使用slf4j(因为{} -constructs允许良好的代码),并使用合适的后端。首先,slf4j发行版中的“slf4j-simple”后端很不错。
请注意,slf4j作者强烈支持logback后端。现在,你不需要那个。
答案 6 :(得分:0)
我的回答有点晚了 - 4年! :)
但仅仅是为了记录,如果你必须使用宏,那么在编译之前只需要在Java代码上运行C ++预处理器。当然,这假设您使用C ++宏语法。
如果你不记得它的作用,那么预处理器就会替换#defined'd items ...
那表示我同意上述内容 - 使用一个像样的框架(虽然恕我直言,但是在Java中使用宏并不是一件愚蠢的事情。)