diff --git a/dd-java-agent/src/main/java/datadog/trace/agent/TracingAgent.java b/dd-java-agent/src/main/java/datadog/trace/agent/TracingAgent.java index 280e53fa9e7..35b0aaeadc6 100644 --- a/dd-java-agent/src/main/java/datadog/trace/agent/TracingAgent.java +++ b/dd-java-agent/src/main/java/datadog/trace/agent/TracingAgent.java @@ -145,6 +145,11 @@ private static void configureLogger() { setSystemPropertyDefault(SIMPLE_LOGGER_SHOW_DATE_TIME_PROPERTY, "true"); setSystemPropertyDefault( SIMPLE_LOGGER_DATE_TIME_FORMAT_PROPERTY, SIMPLE_LOGGER_DATE_TIME_FORMAT_DEFAULT); + + final boolean debugEnabled = isDebugMode(); + if (debugEnabled) { + setSystemPropertyDefault(SIMPLE_LOGGER_DEFAULT_LOG_LEVEL_PROPERTY, "DEBUG"); + } } private static void setSystemPropertyDefault(final String property, final String value) { @@ -285,6 +290,28 @@ private static ClassLoader getPlatformClassLoader() return (ClassLoader) method.invoke(null); } + /** + * Determine if we should log in debug level according to dd.trace.debug + * + * @return true if we should + */ + private static boolean isDebugMode() { + final String tracerDebugLevelSysprop = "dd.trace.debug"; + final String tracerDebugLevelProp = System.getProperty(tracerDebugLevelSysprop); + + if (tracerDebugLevelProp != null) { + return Boolean.parseBoolean(tracerDebugLevelProp); + } + + final String tracerDebugLevelEnv = + System.getenv(tracerDebugLevelSysprop.replace('.', '_').toUpperCase()); + + if (tracerDebugLevelEnv != null) { + return Boolean.parseBoolean(tracerDebugLevelEnv); + } + return false; + } + /** * Search for java or datadog-tracer sysprops which indicate that a custom log manager will be * used. Also search for any app classes known to set a custom log manager. @@ -292,8 +319,13 @@ private static ClassLoader getPlatformClassLoader() * @return true if we detect a custom log manager being used. */ private static boolean isAppUsingCustomLogManager() { - final boolean debugEnabled = - "debug".equalsIgnoreCase(System.getProperty(SIMPLE_LOGGER_DEFAULT_LOG_LEVEL_PROPERTY)); + boolean debugEnabled = false; + if (System.getProperty(SIMPLE_LOGGER_DEFAULT_LOG_LEVEL_PROPERTY) != null) { + debugEnabled = + "debug".equalsIgnoreCase(System.getProperty(SIMPLE_LOGGER_DEFAULT_LOG_LEVEL_PROPERTY)); + } else { + debugEnabled = isDebugMode(); + } final String tracerCustomLogManSysprop = "dd.app.customlogmanager"; final String customLogManagerProp = System.getProperty(tracerCustomLogManSysprop); diff --git a/dd-java-agent/src/test/groovy/datadog/trace/agent/LogLevelTest.groovy b/dd-java-agent/src/test/groovy/datadog/trace/agent/LogLevelTest.groovy new file mode 100644 index 00000000000..22d415e43ee --- /dev/null +++ b/dd-java-agent/src/test/groovy/datadog/trace/agent/LogLevelTest.groovy @@ -0,0 +1,90 @@ +package datadog.trace.agent + +import datadog.trace.agent.test.IntegrationTestUtils + +import jvmbootstraptest.LogLevelChecker +import spock.lang.Specification + + +class LogLevelTest extends Specification { + + + /* Priority: datadog.slf4j.simpleLogger.defaultLogLevel > dd.trace.debug > DD_TRACE_DEBUG + 1: INFO LOGS + 0: DEBUG Logs + */ + + def "dd.trace.debug false"() { + expect: + IntegrationTestUtils.runOnSeparateJvm(LogLevelChecker.getName() + , ["-Ddd.trace.debug=false","-Ddd.jmxfetch.enabled=false","-Ddd.trace.enabled=false"] as String[] + , "" as String[] + , [:] + , true) == 1 + } + def "SLF4J DEBUG && dd.trace.debug is false"() { + expect: + IntegrationTestUtils.runOnSeparateJvm(LogLevelChecker.getName() + , ["-Ddd.trace.debug=false","-Ddatadog.slf4j.simpleLogger.defaultLogLevel=debug","-Ddd.jmxfetch.enabled=false","-Ddd.trace.enabled=false"] as String[] + , "" as String[] + , [:] + , true) == 0 + } + def "dd.trace.debug is false && DD_TRACE_DEBUG is true"() { + expect: + IntegrationTestUtils.runOnSeparateJvm(LogLevelChecker.getName() + , ["-Ddd.trace.debug=false","-Ddd.jmxfetch.enabled=false","-Ddd.trace.enabled=false"] as String[] + , "" as String[] + , ["DD_TRACE_DEBUG": "true"] + , true) == 1 + } + + def "dd.trace.debug is true"() { + expect: + IntegrationTestUtils.runOnSeparateJvm(LogLevelChecker.getName() + , ["-Ddd.trace.debug=true","-Ddd.jmxfetch.enabled=false","-Ddd.trace.enabled=false"] as String[] + , "" as String[] + , [:] + , true) == 0 + } + + + def "DD_TRACE_DEBUG is true"() { + expect: + IntegrationTestUtils.runOnSeparateJvm(LogLevelChecker.getName() + , ["-Ddd.jmxfetch.enabled=false","-Ddd.trace.enabled=false"] as String[] + , "" as String[] + , ["DD_TRACE_DEBUG": "true"] + , true) == 0 + } + + def "dd.trace.debug is true && DD_TRACE_DEBUG is false"() { + expect: + IntegrationTestUtils.runOnSeparateJvm(LogLevelChecker.getName() + , ["-Ddd.trace.debug=true","-Ddd.jmxfetch.enabled=false","-Ddd.trace.enabled=false"] as String[] + , "" as String[] + , ["DD_TRACE_DEBUG": "false"] + , true) == 0 + } + + + + def "SLF4J DEBUG && DD_TRACE_DEBUG is false"() { + expect: + IntegrationTestUtils.runOnSeparateJvm(LogLevelChecker.getName() + , ["-Ddatadog.slf4j.simpleLogger.defaultLogLevel=debug","-Ddd.jmxfetch.enabled=false","-Ddd.trace.enabled=false"] as String[] + , "" as String[] + , ["DD_TRACE_DEBUG": "false"] + , true) == 0 + } + + def "SLF4J INFO && DD_TRACE_DEBUG is true"() { + expect: + IntegrationTestUtils.runOnSeparateJvm(LogLevelChecker.getName() + , ["-Ddatadog.slf4j.simpleLogger.defaultLogLevel=info","-Ddd.jmxfetch.enabled=false","-Ddd.trace.enabled=false"] as String[] + , "" as String[] + , ["DD_TRACE_DEBUG": "true"] + , true) == 1 + } + +} diff --git a/dd-java-agent/src/test/java/jvmbootstraptest/LogLevelChecker.java b/dd-java-agent/src/test/java/jvmbootstraptest/LogLevelChecker.java new file mode 100644 index 00000000000..a9e08e905bb --- /dev/null +++ b/dd-java-agent/src/test/java/jvmbootstraptest/LogLevelChecker.java @@ -0,0 +1,13 @@ +package jvmbootstraptest; + +public class LogLevelChecker { + // returns an exception if logs are not in DEBUG + public static void main(final String[] args) throws ClassNotFoundException { + + String str = System.getProperty("datadog.slf4j.simpleLogger.defaultLogLevel"); + + if ((str == null) || (str != null && !str.equalsIgnoreCase("debug"))) { + throw new RuntimeException("debug mode not set"); + } + } +}