编译器构造在编译时禁用Java中的日志记录
我有一些Java代码,为了调试的目的,我想用日志消息插入这些代码。但是,最终(编译的)生产代码不应包含任何日志记录,因为这会降低执行时间。Java中有没有办法在编译时禁用记录器
我不怕在运行时启用/禁用的记录器的log方法中进行检查会增加内存占用
if (logging==enabled) {// do logging}
但我希望避免在生产代码中使用如下参数构造:
Logger.log("undefined state" + state + " @ " + new Date());
我正在使用Sun的Java编译器
# 1 楼答案
我使用的每个日志框架都要求您使用上述模式,以避免对日志表达式进行不必要的计算
# 2 楼答案
可以使用Proguard对java类文件进行后处理,并使用
-assumenosideeffects
选项删除日志调用。Android最常用的方法是:要删除对
Log.d(TAG, "message")
等的所有调用# 3 楼答案
一种方法是在log方法之外进行检查。与您提到的几乎相同的检查,但您自己进行:
此方法可用于任何日志记录级别。有关更多信息,请参见Logger#isLoggable(Level)。 请注意,这是避免对数方法参数构造的推荐方法
# 4 楼答案
这似乎就是你想要的:
what's log4j actually doing when we turn on or off some log places?
# 5 楼答案
没有一种内在的方式使这成为可能。您可能需要使用Java Preprocessor
# 6 楼答案
您是否考虑过使用{}占位符的slf4j方法。这允许延迟构建toString(),这意味着日志。调试(…)如果禁用调试日志记录,则成本较低