我希望可以根据调试需求更改日志记录级别,但是我找不到检查应用程序是否运行在调试模式下的代码片段。
我正在使用Eclipse来调试该应用程序,所以如果解决方案只适用于Eclipse也没问题。
在 how-to-find-out-if-debug-mode-is-enabled 上找到了答案。
boolean isDebug = java.lang.management.ManagementFactory.getRuntimeMXBean().
getInputArguments().toString().contains("-agentlib:jdwp");
这将检查是否使用了Java调试线协议代理。
您可以修改调试配置。例如,只需在调试配置中添加特殊的 VM 参数。您可以使用 System.getProperties()
读取提供的参数。
更好的做法是修改配置文件(运行和调试)以加载不同的日志配置文件。如果需要编写代码确定日志级别,则不太好。这应该仅仅是一个配置问题。
在JVM内部,没有一种官方认可的可靠方法来确定任何给定的JVM是否处于调试模式,依赖于现有的工具只会在将来某个时候破坏您的代码。
因此,您需要自己引入一种方法。建议如下:
-Ddebug=true
那么你可以使用Boolean.getBoolean("debug")
来检查这个问题。
public static final boolean DEBUG_MODE = System.getProperty("java.vm.info", "").contains("sharing");
这个技巧可以解决问题。
我在Eclipse 3.5中测试过:
package test;
public class Test
{
/**
* @param args
*/
public static void main(String[] args)
{
System.out.println(System.getProperty("java.vm.info", ""));
}
}
将显示:
mixed mode, sharing
如果没有启动调试模式
mixed mode
如果使用调试启动器执行
Joachim Sauer 评论:
这高度依赖于系统。
我假设“共享”表示跨VM类共享处于活动状态。
这是一个非常新的功能,只有在某些平台上才可用。
此外,可能有许多原因可以启用或禁用它,所以我不会将其用于调试模式检测。
(注意:我使用最新的jdk1.6b14进行了测试。我将其留作CW答案。)
请看这里:
http://wiki.eclipse.org/FAQ_How_do_I_use_the_platform_debug_tracing_facility%3F
此外,我认为你无法知道你的应用程序是否在调试模式下运行。唯一能做的就是在调试时向JVM传递参数。Process p = new ProcessBuilder("netstat", "-n").start();
String stdout = IOUtils.toString(p.getInputStream(), Charset.defaultCharset());
然后在标准输出中扫描 127.0.0.1:9999.*ESTABLISHED