Skip to content

Commit

Permalink
SONAR-8333 make ES log into its own log file
Browse files Browse the repository at this point in the history
  • Loading branch information
sns-seb committed Nov 16, 2016
1 parent 38242dc commit adf8fbe
Show file tree
Hide file tree
Showing 7 changed files with 73 additions and 50 deletions.
Expand Up @@ -25,6 +25,7 @@
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.joran.JoranConfigurator;
import ch.qos.logback.classic.jul.LevelChangePropagator;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.LoggerContextListener;
import ch.qos.logback.core.ConsoleAppender;
import ch.qos.logback.core.Context;
Expand All @@ -46,6 +47,8 @@ public class LogbackHelper {

public static final String ROLLING_POLICY_PROPERTY = "sonar.log.rollingPolicy";
public static final String MAX_FILES_PROPERTY = "sonar.log.maxFiles";
private static final String THREAD_ID_PLACEHOLDER = "ZZZZ";
private static final String LOG_FORMAT = "%d{yyyy.MM.dd HH:mm:ss} %-5level [" + THREAD_ID_PLACEHOLDER + "][%logger{20}] %msg%n";

public LoggerContext getRootContext() {
org.slf4j.Logger logger;
Expand Down Expand Up @@ -73,6 +76,25 @@ public LoggerContextListener enableJulChangePropagation(LoggerContext loggerCont
return propagator;
}

public void configureRootLogger(LoggerContext ctx, Props props, String threadIdFieldPattern, String fileName) {
String logFormat = LOG_FORMAT.replace(THREAD_ID_PLACEHOLDER, threadIdFieldPattern);
// configure appender
LogbackHelper.RollingPolicy rollingPolicy = createRollingPolicy(ctx, props, fileName);
FileAppender<ILoggingEvent> fileAppender = rollingPolicy.createAppender("file");
fileAppender.setContext(ctx);
PatternLayoutEncoder fileEncoder = new PatternLayoutEncoder();
fileEncoder.setContext(ctx);
fileEncoder.setPattern(logFormat);
fileEncoder.start();
fileAppender.setEncoder(fileEncoder);
fileAppender.start();

// configure logger
Logger rootLogger = ctx.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME);
rootLogger.addAppender(fileAppender);
rootLogger.detachAppender("console");
}

public ConsoleAppender newConsoleAppender(Context loggerContext, String name, String pattern, Filter... filters) {
PatternLayoutEncoder consoleEncoder = new PatternLayoutEncoder();
consoleEncoder.setContext(loggerContext);
Expand Down
Expand Up @@ -19,26 +19,20 @@
*/
package org.sonar.search;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.ConsoleAppender;
import org.sonar.process.LogbackHelper;
import org.sonar.process.Props;

public class SearchLogging {

private static final String LOG_FORMAT = "%d{yyyy.MM.dd HH:mm:ss} %-5level es[][%logger{20}] %X %msg%n";

private LogbackHelper helper = new LogbackHelper();

public LoggerContext configure() {
public LoggerContext configure(Props props) {
LoggerContext ctx = helper.getRootContext();
ctx.reset();

ConsoleAppender<ILoggingEvent> consoleAppender = helper.newConsoleAppender(ctx, "CONSOLE", LOG_FORMAT);
Logger rootLogger = helper.configureLogger(Logger.ROOT_LOGGER_NAME, Level.INFO);
rootLogger.addAppender(consoleAppender);
helper.configureRootLogger(ctx, props, "", "es");

return ctx;
}
}
Expand Up @@ -86,7 +86,7 @@ public void stop() {

public static void main(String... args) {
ProcessEntryPoint entryPoint = ProcessEntryPoint.createForArguments(args);
new SearchLogging().configure();
new SearchLogging().configure(entryPoint.getProps());
SearchServer searchServer = new SearchServer(entryPoint.getProps());
entryPoint.launch(searchServer);
}
Expand Down
Expand Up @@ -21,29 +21,64 @@

import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.Appender;
import ch.qos.logback.core.ConsoleAppender;
import ch.qos.logback.core.FileAppender;
import java.io.File;
import java.io.IOException;
import java.util.Properties;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.sonar.process.LogbackHelper;
import org.sonar.process.ProcessProperties;
import org.sonar.process.Props;

import static org.assertj.core.api.Assertions.assertThat;

public class SearchLoggingTest {
@Rule
public TemporaryFolder temp = new TemporaryFolder();

SearchLogging underTest = new SearchLogging();
private File logDir;

private Props props = new Props(new Properties());
private SearchLogging underTest = new SearchLogging();

@Before
public void setUp() throws IOException {
logDir = temp.newFolder();
props.set(ProcessProperties.PATH_LOGS, logDir.getAbsolutePath());
}

@AfterClass
public static void resetLogback() throws Exception {
new LogbackHelper().resetFromXml("/logback-test.xml");
}

@Test
public void log_to_console() {
LoggerContext ctx = underTest.configure();
public void do_not_log_to_console() {
LoggerContext ctx = underTest.configure(props);

Logger root = ctx.getLogger(Logger.ROOT_LOGGER_NAME);
Appender appender = root.getAppender("CONSOLE");
assertThat(appender).isInstanceOf(ConsoleAppender.class);
assertThat(appender).isNull();
}

@Test
public void log_to_es_file() {
LoggerContext ctx = underTest.configure(props);

Logger root = ctx.getLogger(Logger.ROOT_LOGGER_NAME);
Appender<ILoggingEvent> appender = root.getAppender("file");
assertThat(appender).isInstanceOf(FileAppender.class);
FileAppender fileAppender = (FileAppender) appender;
assertThat(fileAppender.getFile()).isEqualTo(new File(logDir, "es.log").getAbsolutePath());
assertThat(fileAppender.getEncoder()).isInstanceOf(PatternLayoutEncoder.class);
PatternLayoutEncoder encoder = (PatternLayoutEncoder) fileAppender.getEncoder();
assertThat(encoder.getPattern()).isEqualTo("%d{yyyy.MM.dd HH:mm:ss} %-5level [][%logger{20}] %msg%n");
}
}
Expand Up @@ -19,11 +19,7 @@
*/
package org.sonar.server.app;

import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.FileAppender;
import java.util.logging.LogManager;
import org.slf4j.bridge.SLF4JBridgeHandler;
import org.sonar.api.utils.MessageException;
Expand All @@ -34,24 +30,21 @@

public abstract class ServerProcessLogging {
private static final String LOG_LEVEL_PROPERTY = "sonar.log.level";
private static final String PROCESS_NAME_PLACEHOLDER = "XXXX";
private static final String THREAD_ID_PLACEHOLDER = "ZZZZ";
private static final String LOG_FORMAT = "%d{yyyy.MM.dd HH:mm:ss} %-5level " + PROCESS_NAME_PLACEHOLDER + "[" + THREAD_ID_PLACEHOLDER + "][%logger{20}] %msg%n";
private final String processName;
private final String threadIdPattern;
private final String threadIdFieldPattern;
private final LogbackHelper helper = new LogbackHelper();

protected ServerProcessLogging(String processName, String threadIdPattern) {
protected ServerProcessLogging(String processName, String threadIdFieldPattern) {
this.processName = processName;
this.threadIdPattern = threadIdPattern;
this.threadIdFieldPattern = threadIdFieldPattern;
}

public LoggerContext configure(Props props) {
LoggerContext ctx = helper.getRootContext();
ctx.reset();

helper.enableJulChangePropagation(ctx);
configureRootLogger(ctx, props);
helper.configureRootLogger(ctx, props, threadIdFieldPattern, processName);
configureLevels(props);

// Configure java.util.logging, used by Tomcat, in order to forward to slf4j
Expand All @@ -60,27 +53,6 @@ public LoggerContext configure(Props props) {
return ctx;
}

private void configureRootLogger(LoggerContext ctx, Props props) {
String logFormat = LOG_FORMAT
.replace(PROCESS_NAME_PLACEHOLDER, processName)
.replace(THREAD_ID_PLACEHOLDER, threadIdPattern);
// configure appender
LogbackHelper.RollingPolicy rollingPolicy = helper.createRollingPolicy(ctx, props, processName);
FileAppender<ILoggingEvent> fileAppender = rollingPolicy.createAppender("file");
fileAppender.setContext(ctx);
PatternLayoutEncoder fileEncoder = new PatternLayoutEncoder();
fileEncoder.setContext(ctx);
fileEncoder.setPattern(logFormat);
fileEncoder.start();
fileAppender.setEncoder(fileEncoder);
fileAppender.start();

// configure logger
Logger rootLogger = ctx.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME);
rootLogger.addAppender(fileAppender);
rootLogger.detachAppender("console");
}

private void configureLevels(Props props) {
String levelCode = props.value(LOG_LEVEL_PROPERTY, "INFO");
LoggerLevel level;
Expand Down
Expand Up @@ -83,7 +83,7 @@ public void log_to_ce_file() {
assertThat(fileAppender.getFile()).isEqualTo(new File(logDir, "ce.log").getAbsolutePath());
assertThat(fileAppender.getEncoder()).isInstanceOf(PatternLayoutEncoder.class);
PatternLayoutEncoder encoder = (PatternLayoutEncoder) fileAppender.getEncoder();
assertThat(encoder.getPattern()).isEqualTo("%d{yyyy.MM.dd HH:mm:ss} %-5level ce[%X{ceTaskUuid}][%logger{20}] %msg%n");
assertThat(encoder.getPattern()).isEqualTo("%d{yyyy.MM.dd HH:mm:ss} %-5level [%X{ceTaskUuid}][%logger{20}] %msg%n");
}

@Test
Expand Down
Expand Up @@ -83,7 +83,7 @@ public void log_to_web_file() {
assertThat(fileAppender.getFile()).isEqualTo(new File(logDir, "web.log").getAbsolutePath());
assertThat(fileAppender.getEncoder()).isInstanceOf(PatternLayoutEncoder.class);
PatternLayoutEncoder encoder = (PatternLayoutEncoder) fileAppender.getEncoder();
assertThat(encoder.getPattern()).isEqualTo("%d{yyyy.MM.dd HH:mm:ss} %-5level web[%X{UID}][%logger{20}] %msg%n");
assertThat(encoder.getPattern()).isEqualTo("%d{yyyy.MM.dd HH:mm:ss} %-5level [%X{UID}][%logger{20}] %msg%n");
}

@Test
Expand Down

0 comments on commit adf8fbe

Please sign in to comment.