@Override protected void extendLogLevelConfiguration(LogLevelConfig.Builder logLevelConfigBuilder) { logLevelConfigBuilder.levelByDomain("sql", ProcessId.COMPUTE_ENGINE, LogDomain.SQL); logLevelConfigBuilder.levelByDomain("es", ProcessId.COMPUTE_ENGINE, LogDomain.ES); JMX_RMI_LOGGER_NAMES.forEach(loggerName -> logLevelConfigBuilder.levelByDomain(loggerName, ProcessId.COMPUTE_ENGINE, LogDomain.JMX)); LOGGER_NAMES_TO_TURN_OFF.forEach(loggerName -> logLevelConfigBuilder.immutableLevel(loggerName, Level.OFF)); }
@Test public void changeRoot_sets_level_of_ROOT_and_all_loggers_with_a_config_but_the_hardcoded_one() { LogLevelConfig config = newLogLevelConfig() .rootLevelFor(ProcessId.WEB_SERVER) .levelByDomain("foo", ProcessId.WEB_SERVER, LogDomain.JMX) .levelByDomain("bar", ProcessId.COMPUTE_ENGINE, LogDomain.ES) .immutableLevel("doh", Level.ERROR) .immutableLevel("pif", Level.TRACE) .build(); LoggerContext context = underTest.apply(config, props); assertThat(context.getLogger(ROOT_LOGGER_NAME).getLevel()).isEqualTo(Level.INFO); assertThat(context.getLogger("foo").getLevel()).isEqualTo(Level.INFO); assertThat(context.getLogger("bar").getLevel()).isEqualTo(Level.INFO); assertThat(context.getLogger("doh").getLevel()).isEqualTo(Level.ERROR); assertThat(context.getLogger("pif").getLevel()).isEqualTo(Level.TRACE); underTest.changeRoot(config, Level.DEBUG); assertThat(context.getLogger(ROOT_LOGGER_NAME).getLevel()).isEqualTo(Level.DEBUG); assertThat(context.getLogger("foo").getLevel()).isEqualTo(Level.DEBUG); assertThat(context.getLogger("bar").getLevel()).isEqualTo(Level.DEBUG); assertThat(context.getLogger("doh").getLevel()).isEqualTo(Level.ERROR); assertThat(context.getLogger("pif").getLevel()).isEqualTo(Level.TRACE); }
String logbackRootLoggerName = underTest.getRootLoggerName(); LogLevelConfig config = LogLevelConfig.newBuilder(logbackRootLoggerName) .levelByDomain(logbackRootLoggerName, ProcessId.WEB_SERVER, LogDomain.JMX).build(); props.set("sonar.log.level.web", "TRACE"); underTest.apply(config, props);
@Override protected void extendLogLevelConfiguration(LogLevelConfig.Builder logLevelConfigBuilder) { logLevelConfigBuilder.levelByDomain("sql", ProcessId.WEB_SERVER, LogDomain.SQL); logLevelConfigBuilder.levelByDomain("es", ProcessId.WEB_SERVER, LogDomain.ES); logLevelConfigBuilder.levelByDomain("auth.event", ProcessId.WEB_SERVER, LogDomain.AUTH_EVENT); JMX_RMI_LOGGER_NAMES.forEach(loggerName -> logLevelConfigBuilder.levelByDomain(loggerName, ProcessId.WEB_SERVER, LogDomain.JMX)); logLevelConfigBuilder.offUnlessTrace("org.apache.catalina.core.ContainerBase"); logLevelConfigBuilder.offUnlessTrace("org.apache.catalina.core.StandardContext"); logLevelConfigBuilder.offUnlessTrace("org.apache.catalina.core.StandardService"); LOGGER_NAMES_TO_TURN_OFF.forEach(loggerName -> logLevelConfigBuilder.immutableLevel(loggerName, Level.OFF)); }
@Test public void apply_sets_domain_property_over_process_property_if_both_set() { LogLevelConfig config = newLogLevelConfig().levelByDomain("foo", ProcessId.WEB_SERVER, LogDomain.ES).build(); Log4JPropertiesBuilder underTest = newLog4JPropertiesBuilder( "sonar.log.level.web", "DEBUG", "sonar.log.level.web.es", "TRACE"); underTest.apply(config); verifyLoggerProperties(underTest.get(), "foo", Level.TRACE); }
@Test public void apply_fails_with_IAE_if_domain_property_has_unsupported_level() { LogLevelConfig config = newLogLevelConfig().levelByDomain("foo", ProcessId.WEB_SERVER, LogDomain.JMX).build(); props.set("sonar.log.level.web.jmx", "ERROR"); expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("log level ERROR in property sonar.log.level.web.jmx is not a supported value (allowed levels are [TRACE, DEBUG, INFO])"); underTest.apply(config, props); }
@Test public void apply_sets_domain_property_over_process_property_if_both_set() { LogLevelConfig config = newLogLevelConfig().levelByDomain("foo", ProcessId.WEB_SERVER, LogDomain.ES).build(); props.set("sonar.log.level.web", "DEBUG"); props.set("sonar.log.level.web.es", "TRACE"); LoggerContext context = underTest.apply(config, props); assertThat(context.getLogger("foo").getLevel()).isEqualTo(Level.TRACE); }
@Test public void builder_levelByDomain_fails_with_ISE_if_loggerName_has_immutableLevel() { underTest.immutableLevel("bar", Level.INFO); expectedException.expect(IllegalStateException.class); expectedException.expectMessage("Configuration hardcoded level already registered for bar"); underTest.levelByDomain("bar", ProcessId.WEB_SERVER, LogDomain.JMX); }
@Test public void builder_levelByDomain_adds_global_process_and_domain_properties_in_order_for_specified_logger() { LogLevelConfig underTest = newBuilder(rootLoggerName) .levelByDomain("foo", ProcessId.WEB_SERVER, LogDomain.SQL) .build(); assertThat(underTest.getConfiguredByProperties()).hasSize(1); assertThat(underTest.getConfiguredByProperties().get("foo")) .containsExactly("sonar.log.level", "sonar.log.level.web", "sonar.log.level.web.sql"); assertThat(underTest.getConfiguredByHardcodedLevel()).hasSize(0); }
@Test public void builder_levelByDomain_fails_with_IAE_if_loggerName_is_empty() { expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("loggerName can't be empty"); underTest.levelByDomain("", ProcessId.WEB_SERVER, LogDomain.JMX); }
@Test public void apply_creates_loggers_property_with_logger_names_ordered_but_root() { LogLevelConfig config = newLogLevelConfig() .rootLevelFor(ProcessId.WEB_SERVER) .levelByDomain("foo", ProcessId.WEB_SERVER, LogDomain.JMX) .levelByDomain("bar", ProcessId.COMPUTE_ENGINE, LogDomain.ES) .immutableLevel("doh", Level.ERROR) .immutableLevel("pif", Level.TRACE) .offUnlessTrace("fii") .build(); underTest.apply(config); assertThat(underTest.get().getProperty("loggers")).isEqualTo("bar,doh,fii,foo,pif"); }
@Test public void apply_sets_domain_property_over_global_property_if_both_set() { LogLevelConfig config = newLogLevelConfig().levelByDomain("foo", ProcessId.WEB_SERVER, LogDomain.ES).build(); Log4JPropertiesBuilder underTest = newLog4JPropertiesBuilder( "sonar.log.level", "DEBUG", "sonar.log.level.web.es", "TRACE"); underTest.apply(config); verifyLoggerProperties(underTest.get(), "foo", Level.TRACE); }
@Test public void apply_sets_domain_property_over_process_and_global_property_if_all_set() { LogLevelConfig config = newLogLevelConfig().levelByDomain("foo", ProcessId.WEB_SERVER, LogDomain.ES).build(); Log4JPropertiesBuilder underTest = newLog4JPropertiesBuilder( "sonar.log.level", "DEBUG", "sonar.log.level.web", "DEBUG", "sonar.log.level.web.es", "TRACE"); underTest.apply(config); verifyLoggerProperties(underTest.get(), "foo", Level.TRACE); }
@Test public void apply_sets_domain_property_over_process_and_global_property_if_all_set() { LogLevelConfig config = newLogLevelConfig().levelByDomain("foo", ProcessId.WEB_SERVER, LogDomain.ES).build(); props.set("sonar.log.level", "DEBUG"); props.set("sonar.log.level.web", "DEBUG"); props.set("sonar.log.level.web.es", "TRACE"); LoggerContext context = underTest.apply(config, props); assertThat(context.getLogger("foo").getLevel()).isEqualTo(Level.TRACE); }
@Test public void builder_levelByDomain_fails_with_NPE_if_loggerName_is_null() { expectedException.expect(NullPointerException.class); expectedException.expectMessage("loggerName can't be null"); underTest.levelByDomain(null, ProcessId.WEB_SERVER, LogDomain.JMX); }
@Test public void builder_fails_with_ISE_if_logger_has_domain_config() { underTest.levelByDomain("pop", ProcessId.WEB_SERVER, LogDomain.JMX); expectedException.expect(IllegalStateException.class); expectedException.expectMessage("Configuration by property already registered for pop"); underTest.immutableLevel("pop", Level.DEBUG); }
@Test public void builder_levelByDomain_fails_with_NPE_if_LogDomain_is_null() { expectedException.expect(NullPointerException.class); expectedException.expectMessage("LogDomain can't be null"); underTest.levelByDomain("bar", ProcessId.WEB_SERVER, null); }
@Test public void builder_levelByDomain_fails_with_NPE_if_ProcessId_is_null() { expectedException.expect(NullPointerException.class); expectedException.expectMessage("ProcessId can't be null"); underTest.levelByDomain("bar", null, LogDomain.JMX); }
@Test public void apply_fails_with_IAE_if_domain_property_has_unsupported_level() { LogLevelConfig config = newLogLevelConfig().levelByDomain("foo", ProcessId.WEB_SERVER, LogDomain.JMX).build(); Log4JPropertiesBuilder underTest = newLog4JPropertiesBuilder("sonar.log.level.web.jmx", "ERROR"); expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("log level ERROR in property sonar.log.level.web.jmx is not a supported value (allowed levels are [TRACE, DEBUG, INFO])"); underTest.apply(config); }
@Test public void apply_sets_domain_property_over_global_property_if_both_set() { LogLevelConfig config = newLogLevelConfig().levelByDomain("foo", ProcessId.WEB_SERVER, LogDomain.ES).build(); props.set("sonar.log.level", "DEBUG"); props.set("sonar.log.level.web.es", "TRACE"); LoggerContext context = underTest.apply(config, props); assertThat(context.getLogger("foo").getLevel()).isEqualTo(Level.TRACE); }