Skip to content

Commit

Permalink
If an error occurred while setting up logback, the error message is n…
Browse files Browse the repository at this point in the history
…ot now printed to the console
  • Loading branch information
Christoffer Eide committed Feb 17, 2015
1 parent dbe1fe4 commit 515a719
Show file tree
Hide file tree
Showing 2 changed files with 115 additions and 8 deletions.
Expand Up @@ -10,10 +10,11 @@
import ch.qos.logback.core.ConsoleAppender; import ch.qos.logback.core.ConsoleAppender;
import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.logback.InstrumentedAppender; import com.codahale.metrics.logback.InstrumentedAppender;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import org.slf4j.ILoggerFactory;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.slf4j.bridge.SLF4JBridgeHandler; import org.slf4j.bridge.SLF4JBridgeHandler;


Expand All @@ -25,6 +26,9 @@
import java.util.Map; import java.util.Map;
import java.util.TimeZone; import java.util.TimeZone;


import static ch.qos.logback.core.util.StatusPrinter.printIfErrorsOccured;
import static com.google.common.base.Preconditions.checkNotNull;

public class LoggingFactory { public class LoggingFactory {
// initially configure for WARN+ console logging // initially configure for WARN+ console logging
public static void bootstrap() { public static void bootstrap() {
Expand Down Expand Up @@ -71,6 +75,18 @@ private static void hijackJDKLogging() {
new ConsoleAppenderFactory() new ConsoleAppenderFactory()
); );


@JsonIgnore
private final LoggerContext loggerContext;

public LoggingFactory() {
this((LoggerContext) LoggerFactory.getILoggerFactory());
}

@VisibleForTesting
LoggingFactory(LoggerContext loggerContext) {
this.loggerContext = checkNotNull(loggerContext);
}

@JsonProperty @JsonProperty
public Level getLevel() { public Level getLevel() {
return level; return level;
Expand Down Expand Up @@ -110,6 +126,8 @@ public void configure(MetricRegistry metricRegistry, String name) {
root.addAppender(output.build(root.getLoggerContext(), name, null)); root.addAppender(output.build(root.getLoggerContext(), name, null));
} }


printIfErrorsOccured(root.getLoggerContext());

final MBeanServer server = ManagementFactory.getPlatformMBeanServer(); final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
try { try {
final ObjectName objectName = new ObjectName("io.dropwizard:type=Logging"); final ObjectName objectName = new ObjectName("io.dropwizard:type=Logging");
Expand All @@ -128,11 +146,7 @@ public void configure(MetricRegistry metricRegistry, String name) {
} }


public void stop() { public void stop() {
ILoggerFactory loggerFactory = LoggerFactory.getILoggerFactory(); loggerContext.stop();
if (loggerFactory instanceof LoggerContext) {
LoggerContext context = (LoggerContext) loggerFactory;
context.stop();
}
} }


private void configureInstrumentation(Logger root, MetricRegistry metricRegistry) { private void configureInstrumentation(Logger root, MetricRegistry metricRegistry) {
Expand All @@ -143,7 +157,7 @@ private void configureInstrumentation(Logger root, MetricRegistry metricRegistry
} }


private Logger configureLevels() { private Logger configureLevels() {
final Logger root = (Logger) LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); final Logger root = loggerContext.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
root.getLoggerContext().reset(); root.getLoggerContext().reset();


final LevelChangePropagator propagator = new LevelChangePropagator(); final LevelChangePropagator propagator = new LevelChangePropagator();
Expand All @@ -155,7 +169,7 @@ private Logger configureLevels() {
root.setLevel(level); root.setLevel(level);


for (Map.Entry<String, Level> entry : loggers.entrySet()) { for (Map.Entry<String, Level> entry : loggers.entrySet()) {
((Logger) LoggerFactory.getLogger(entry.getKey())).setLevel(entry.getValue()); loggerContext.getLogger(entry.getKey()).setLevel(entry.getValue());
} }


return root; return root;
Expand Down
@@ -0,0 +1,93 @@
package io.dropwizard.logging;

import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.core.util.StatusPrinter;
import com.codahale.metrics.MetricRegistry;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;

import static java.util.Collections.singletonList;
import static org.assertj.core.api.Assertions.assertThat;

public class LoggingFactoryPrintErrorMessagesTest {

@Rule
public final TemporaryFolder tempDir = new TemporaryFolder();

File folderWithoutWritePermission;
File folderWithWritePermission;

LoggingFactory factory;
LoggerContext loggerContext;

@Before
public void setUp() throws Exception {
folderWithoutWritePermission = tempDir.newFolder("folder-without-write-permission");
folderWithoutWritePermission.setWritable(false);

folderWithWritePermission = tempDir.newFolder("folder-with-write-permission");

loggerContext = new LoggerContext();
factory = new LoggingFactory(loggerContext);
}

@After
public void tearDown() throws Exception {
loggerContext.stop();
}

private void configureLoggingFactoryWithFileAppender(File file){
factory.setAppenders(singletonList(newFileAppenderFactory(file)));
}

private AppenderFactory newFileAppenderFactory(File file){
FileAppenderFactory fileAppenderFactory = new FileAppenderFactory();

fileAppenderFactory.setCurrentLogFilename(file.toString() + File.separator + "my-log-file.log");
fileAppenderFactory.setArchive(false);

return fileAppenderFactory;
}

private String configureAndCaptureSystemOut() throws UnsupportedEncodingException {
ByteArrayOutputStream out = new ByteArrayOutputStream();

try {
StatusPrinter.setPrintStream(new PrintStream(out));
factory.configure(new MetricRegistry(), "logger-test");
}finally {
StatusPrinter.setPrintStream(System.out);
}

return out.toString(StandardCharsets.UTF_8.name());
}

@Test
public void testWhenFileAppenderDoesNotHaveWritePermissionToFolder_PrintsErrorMessageToConsole() throws Exception {
File file = folderWithoutWritePermission;

configureLoggingFactoryWithFileAppender(file);

assertThat(file.canWrite()).isFalse();
assertThat(configureAndCaptureSystemOut()).contains(file.toString());
}

@Test
public void testWhenSettingUpLoggingWithValidConfiguration_NoErrorMessageIsPrintedToConsole() throws Exception {
File file = folderWithWritePermission;

configureLoggingFactoryWithFileAppender(file);

assertThat(file.canWrite()).isTrue();
assertThat(configureAndCaptureSystemOut()).isEmpty();
}
}

0 comments on commit 515a719

Please sign in to comment.