public void apply(LogLevelConfig logLevelConfig) { if (!ROOT_LOGGER_NAME.equals(logLevelConfig.getRootLoggerName())) { throw new IllegalArgumentException("Value of LogLevelConfig#rootLoggerName must be \"" + ROOT_LOGGER_NAME + "\""); } Level propertyValueAsLevel = getPropertyValueAsLevel(props, SONAR_LOG_LEVEL_PROPERTY); boolean traceGloballyEnabled = propertyValueAsLevel == Level.TRACE; List<String> loggerNames = Stream.of( logLevelConfig.getConfiguredByProperties().keySet().stream(), logLevelConfig.getConfiguredByHardcodedLevel().keySet().stream(), logLevelConfig.getOffUnlessTrace().stream().filter(k -> !traceGloballyEnabled)) .flatMap(s -> s) .filter(loggerName -> !ROOT_LOGGER_NAME.equals(loggerName)) .distinct() .sorted() .collect(Collectors.toList()); if (!loggerNames.isEmpty()) { putProperty("loggers", loggerNames.stream().collect(Collectors.joining(","))); } logLevelConfig.getConfiguredByProperties().forEach((loggerName, value) -> applyLevelByProperty(props, loggerName, value)); logLevelConfig.getConfiguredByHardcodedLevel().forEach(this::applyHardcodedLevel); logLevelConfig.getOffUnlessTrace().stream().filter(k -> !traceGloballyEnabled).forEach(logger -> applyHardcodedLevel(logger, Level.OFF)); }
/** * Applies the specified {@link LogLevelConfig} reading the specified {@link Props}. * * @throws IllegalArgumentException if the any level specified in a property is not one of {@link #ALLOWED_ROOT_LOG_LEVELS} */ public LoggerContext apply(LogLevelConfig logLevelConfig, Props props) { if (!ROOT_LOGGER_NAME.equals(logLevelConfig.getRootLoggerName())) { throw new IllegalArgumentException("Value of LogLevelConfig#rootLoggerName must be \"" + ROOT_LOGGER_NAME + "\""); } LoggerContext rootContext = getRootContext(); logLevelConfig.getConfiguredByProperties().forEach((key, value) -> applyLevelByProperty(props, rootContext.getLogger(key), value)); logLevelConfig.getConfiguredByHardcodedLevel().forEach((key, value) -> applyHardcodedLevel(rootContext, key, value)); Level propertyValueAsLevel = getPropertyValueAsLevel(props, SONAR_LOG_LEVEL_PROPERTY); boolean traceGloballyEnabled = propertyValueAsLevel == Level.TRACE; logLevelConfig.getOffUnlessTrace().forEach(logger -> applyHardUnlessTrace(rootContext, logger, traceGloballyEnabled)); return rootContext; }
@Test public void builder_immutableLevel_set_specified_level_for_specified_logger() { LogLevelConfig config = underTest.immutableLevel("bar", Level.INFO).build(); assertThat(config.getConfiguredByProperties()).isEmpty(); assertThat(config.getConfiguredByHardcodedLevel()).hasSize(1); assertThat(config.getConfiguredByHardcodedLevel().get("bar")).isEqualTo(Level.INFO); }
@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 build_can_create_empty_config_and_returned_maps_are_unmodifiable() { LogLevelConfig underTest = newBuilder(rootLoggerName).build(); expectUnsupportedOperationException(() -> underTest.getConfiguredByProperties().put("1", Collections.emptyList())); expectUnsupportedOperationException(() -> underTest.getConfiguredByHardcodedLevel().put("1", Level.ERROR)); }
@Test public void builder_rootLevelFor_add_global_and_process_property_in_order_for_root_logger() { LogLevelConfig underTest = newBuilder(rootLoggerName).rootLevelFor(ProcessId.ELASTICSEARCH).build(); assertThat(underTest.getConfiguredByProperties()).hasSize(1); assertThat(underTest.getConfiguredByProperties().get(rootLoggerName)) .containsExactly("sonar.log.level", "sonar.log.level.es"); assertThat(underTest.getConfiguredByHardcodedLevel()).hasSize(0); }