Warn if unsupported logging configuration present

This commit adds a warning that an unsupported logging configuration is
present and points users to the new logging configuration file.

Relates #20309
This commit is contained in:
Jason Tedor 2016-09-02 18:36:57 -04:00 committed by GitHub
parent bfd072bc10
commit 40f889b825
3 changed files with 56 additions and 11 deletions

View File

@ -30,6 +30,7 @@ import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
import org.apache.logging.log4j.core.config.composite.CompositeConfiguration;
import org.apache.logging.log4j.core.config.properties.PropertiesConfiguration;
import org.apache.logging.log4j.core.config.properties.PropertiesConfigurationFactory;
import org.elasticsearch.Version;
import org.elasticsearch.cluster.ClusterName;
import org.elasticsearch.common.SuppressForbidden;
import org.elasticsearch.common.settings.Settings;
@ -43,6 +44,7 @@ import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.List;
import java.util.Map;
@ -63,9 +65,9 @@ public class LogConfigurator {
final LoggerContext context = (LoggerContext) LogManager.getContext(false);
if (resolveConfig) {
final Set<FileVisitOption> options = EnumSet.of(FileVisitOption.FOLLOW_LINKS);
final List<AbstractConfiguration> configurations = new ArrayList<>();
final PropertiesConfigurationFactory factory = new PropertiesConfigurationFactory();
final Set<FileVisitOption> options = EnumSet.of(FileVisitOption.FOLLOW_LINKS);
Files.walkFileTree(environment.configFile(), options, Integer.MAX_VALUE, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
@ -87,10 +89,36 @@ public class LogConfigurator {
final Level level = ESLoggerFactory.LOG_LEVEL_SETTING.getConcreteSetting(key).get(settings);
Loggers.setLevel(Loggers.getLogger(key.substring("logger.".length())), level);
}
warnIfOldConfigurationFilePresent(environment);
}
private static void warnIfOldConfigurationFilePresent(final Environment environment) throws IOException {
// TODO: the warning for unsupported logging configurations can be removed in 6.0.0
assert Version.CURRENT.major < 6;
final List<String> suffixes = Arrays.asList(".yml", ".yaml", ".json", ".properties");
final Set<FileVisitOption> options = EnumSet.of(FileVisitOption.FOLLOW_LINKS);
Files.walkFileTree(environment.configFile(), options, Integer.MAX_VALUE, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
final String fileName = file.getFileName().toString();
if (fileName.startsWith("logging")) {
for (final String suffix : suffixes) {
if (fileName.endsWith(suffix)) {
Loggers.getLogger(LogConfigurator.class).warn(
"ignoring unsupported logging configuration file [{}], logging is configured via [{}]",
file.toString(),
file.getParent().resolve("log4j2.properties"));
}
}
}
return FileVisitResult.CONTINUE;
}
});
}
@SuppressForbidden(reason = "sets system property for logging configuration")
private static void setLogConfigurationSystemProperty(Environment environment, Settings settings) {
private static void setLogConfigurationSystemProperty(final Environment environment, final Settings settings) {
System.setProperty("es.logs", environment.logsFile().resolve(ClusterName.CLUSTER_NAME_SETTING.get(settings).value()).toString());
}

View File

@ -21,15 +21,16 @@ package org.elasticsearch.common.logging;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Logger;
import org.elasticsearch.Version;
import org.elasticsearch.common.io.PathUtils;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.env.Environment;
import org.elasticsearch.test.ESTestCase;
import org.elasticsearch.test.hamcrest.RegexMatcher;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ -66,21 +67,22 @@ public class EvilLoggerTests extends ESTestCase {
testLogger.trace("This is a trace message");
final String path = System.getProperty("es.logs") + ".log";
final List<String> events = Files.readAllLines(PathUtils.get(path));
assertThat(events.size(), equalTo(5));
assertThat(events.size(), equalTo(6)); // the five messages me log plus a warning for unsupported configuration files
final String location = "org.elasticsearch.common.logging.EvilLoggerTests.testLocationInfoTest";
assertLogLine(events.get(0), Level.ERROR, location, "This is an error message");
assertLogLine(events.get(1), Level.WARN, location, "This is a warning message");
assertLogLine(events.get(2), Level.INFO, location, "This is an info message");
assertLogLine(events.get(3), Level.DEBUG, location, "This is a debug message");
assertLogLine(events.get(4), Level.TRACE, location, "This is a trace message");
// the first message is a warning for unsupported configuration files
assertLogLine(events.get(1), Level.ERROR, location, "This is an error message");
assertLogLine(events.get(2), Level.WARN, location, "This is a warning message");
assertLogLine(events.get(3), Level.INFO, location, "This is an info message");
assertLogLine(events.get(4), Level.DEBUG, location, "This is a debug message");
assertLogLine(events.get(5), Level.TRACE, location, "This is a trace message");
}
private void assertLogLine(final String logLine, final Level level, final String location, final String message) {
final Matcher matcher = Pattern.compile("\\[(.*)\\]\\[(.*)\\(.*\\)\\] (.*)").matcher(logLine);
assertTrue(logLine, matcher.matches());
assertThat(matcher.group(1), equalTo(level.toString()));
assertThat(matcher.group(2), equalTo(location));
assertThat(matcher.group(3), equalTo(message));
assertThat(matcher.group(2), RegexMatcher.matches(location));
assertThat(matcher.group(3), RegexMatcher.matches(message));
}
public void testDeprecationLogger() throws IOException {
@ -95,4 +97,17 @@ public class EvilLoggerTests extends ESTestCase {
"This is a deprecation message");
}
public void testUnsupportedLoggingConfigurationFiles() throws IOException {
// TODO: the warning for unsupported logging configurations can be removed in 6.0.0
assert Version.CURRENT.major < 6;
final String path = System.getProperty("es.logs") + ".log";
final List<String> events = Files.readAllLines(PathUtils.get(path));
assertThat(events.size(), equalTo(1));
assertLogLine(
events.get(0),
Level.WARN,
"org\\.elasticsearch\\.common\\.logging\\.LogConfigurator.*",
"ignoring unsupported logging configuration file \\[.*\\], logging is configured via \\[.*\\]");
}
}

View File

@ -0,0 +1,2 @@
logger.level: INFO
rootLogger: ${logger.level}, terminal