diff --git a/logback-access/src/main/java/ch/qos/logback/access/jetty/RequestLogImpl.java b/logback-access/src/main/java/ch/qos/logback/access/jetty/RequestLogImpl.java index 9071b03..eeb75d9 100644 --- a/logback-access/src/main/java/ch/qos/logback/access/jetty/RequestLogImpl.java +++ b/logback-access/src/main/java/ch/qos/logback/access/jetty/RequestLogImpl.java @@ -14,10 +14,12 @@ package ch.qos.logback.access.jetty; import java.io.File; +import java.io.InputStream; import java.util.HashMap; import java.util.Iterator; import java.util.List; +import ch.qos.logback.core.status.InfoStatus; import ch.qos.logback.core.util.StatusPrinter; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.RequestLog; @@ -118,6 +120,7 @@ public class RequestLogImpl extends ContextBase implements RequestLog, AppenderAttachableImpl aai = new AppenderAttachableImpl(); FilterAttachableImpl fai = new FilterAttachableImpl(); String fileName; + String classpathFileName; boolean started = false; boolean quiet = false; @@ -137,7 +140,8 @@ public class RequestLogImpl extends ContextBase implements RequestLog, } public void start() { - if (fileName == null) { + if (fileName == null && classpathFileName == null) { + // only look up fallback files if classpathFileName was unspecified String jettyHomeProperty = OptionHelper.getSystemProperty("jetty.home"); if (OptionHelper.isEmpty(jettyHomeProperty)) { getStatusManager().add( @@ -150,12 +154,27 @@ public class RequestLogImpl extends ContextBase implements RequestLog, new WarnStatus("fileName property not set. Assuming [" + fileName + "]", this)); } - File configFile = new File(fileName); - if (configFile.exists()) { - runJoranOnFile(configFile); + + if (classpathFileName == null) { + // no classpath file set; proceed with filesystem configuration + File configFile = new File(fileName); + if (configFile.exists()) { + getStatusManager().add(new InfoStatus("Configuring via file [" + fileName + "]", this)); + runJoranOnFile(configFile); + } else { + getStatusManager().add( + new ErrorStatus("Could not find logback-access configuration file [" + fileName + "]", this)); + } } else { - getStatusManager().add( - new ErrorStatus("Could not find logback-access configuration file [" + fileName + "]", this)); + // classpath file was set + InputStream configStream = getClass().getResourceAsStream(classpathFileName); + if (configStream != null) { + getStatusManager().add(new InfoStatus("Configuring via classpath resource [" + classpathFileName + "]", this)); + runJoranOnStream(configStream); + } else { + getStatusManager().add( + new ErrorStatus("Could not find logback-access configuration file in classpath at [" + classpathFileName + "]", this)); + } } if (!isQuiet()) { StatusPrinter.print(getStatusManager()); @@ -163,19 +182,36 @@ public class RequestLogImpl extends ContextBase implements RequestLog, started = true; } + private void runJoranOnStream(InputStream configFile) { + try { + getConfigurator().doConfigure(configFile); + setNamePostConfigure(); + } catch (JoranException e) { + // errors have been registered as status messages + } + } + private void runJoranOnFile(File configFile) { try { - JoranConfigurator jc = new JoranConfigurator(); - jc.setContext(this); - jc.doConfigure(configFile); - if (getName() == null) { - setName("LogbackRequestLog"); - } + getConfigurator().doConfigure(configFile); + setNamePostConfigure(); } catch (JoranException e) { // errors have been registered as status messages } } + private void setNamePostConfigure() { + if (getName() == null) { + setName("LogbackRequestLog"); + } + } + + private JoranConfigurator getConfigurator() { + JoranConfigurator jc = new JoranConfigurator(); + jc.setContext(this); + return jc; + } + public void stop() { aai.detachAndStopAllAppenders(); started = false; @@ -185,10 +221,28 @@ public class RequestLogImpl extends ContextBase implements RequestLog, return started; } + /** + * Set the filesystem path to the logback-access config file. If non-null, this will be used in favor of any value set + * by {@link RequestLogImpl#setClasspathFileName(String)}. + * + * @param fileName filesystem path + * @see RequestLogImpl#setClasspathFileName(String) + */ public void setFileName(String fileName) { this.fileName = fileName; } + /** + * Set the path in the classpath to the logback-access config file. This will only be used if the file name set via + * {@link RequestLogImpl#setFileName(String)} is null (which is its default). + * + * @param classpathFileName classpath path + * @see RequestLogImpl#setFileName(String) + */ + public void setClasspathFileName(String classpathFileName) { + this.classpathFileName = classpathFileName; + } + public boolean isStarted() { return started; }