From 43353eb1dcc22f9ab9dd01a0e3ebe2722c56acd5 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Mon, 29 Feb 2016 22:14:35 +0100 Subject: [PATCH] fixed LOGBACK-1142 --- .../logback/classic/BasicConfigurator.java | 39 ++++++------ .../logback/classic/layout/TTLLLayout.java | 61 +++++++++++++++++++ .../classic/util/ContextInitializer.java | 1 - .../src/site/pages/manual/configuration.html | 43 ++++++++----- logback-site/src/site/pages/news.html | 13 +++- 5 files changed, 120 insertions(+), 37 deletions(-) create mode 100755 logback-classic/src/main/java/ch/qos/logback/classic/layout/TTLLLayout.java diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/BasicConfigurator.java b/logback-classic/src/main/java/ch/qos/logback/classic/BasicConfigurator.java index fe1ed2992..9e9488b28 100644 --- a/logback-classic/src/main/java/ch/qos/logback/classic/BasicConfigurator.java +++ b/logback-classic/src/main/java/ch/qos/logback/classic/BasicConfigurator.java @@ -13,44 +13,47 @@ */ package ch.qos.logback.classic; -import ch.qos.logback.classic.encoder.PatternLayoutEncoder; +import ch.qos.logback.classic.layout.TTLLLayout; import ch.qos.logback.classic.spi.Configurator; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.ConsoleAppender; +import ch.qos.logback.core.encoder.LayoutWrappingEncoder; import ch.qos.logback.core.spi.ContextAwareBase; -import ch.qos.logback.core.status.InfoStatus; -import ch.qos.logback.core.status.StatusManager; /** * BasicConfigurator configures logback-classic by attaching a * {@link ConsoleAppender} to the root logger. The console appender's layout - * is set to a {@link PatternLayout} with the pattern - * "%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n". + * is set to a {@link ch.qos.logback.classic.layout.TTLLLayout TTLLLayout}. * - * @author Ceki Gulcu + * @author Ceki Gülcü */ public class BasicConfigurator extends ContextAwareBase implements Configurator { - //final static BasicConfigurator hiddenSingleton = new BasicConfigurator(); - public BasicConfigurator() { } public void configure(LoggerContext lc) { - StatusManager sm = lc.getStatusManager(); - if (sm != null) { - sm.add(new InfoStatus("Setting up default configuration.", lc)); - } + addInfo("Setting up default configuration."); + ConsoleAppender ca = new ConsoleAppender(); ca.setContext(lc); ca.setName("console"); - PatternLayoutEncoder pl = new PatternLayoutEncoder(); - pl.setContext(lc); - pl.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"); - pl.start(); - - ca.setEncoder(pl); + LayoutWrappingEncoder encoder = new LayoutWrappingEncoder(); + encoder.setContext(lc); + + + // same as + // PatternLayout layout = new PatternLayout(); + // layout.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"); + TTLLLayout layout = new TTLLLayout(); + + layout.setContext(lc); + layout.start(); + encoder.setLayout(layout); + + ca.setEncoder(encoder); ca.start(); + Logger rootLogger = lc.getLogger(Logger.ROOT_LOGGER_NAME); rootLogger.addAppender(ca); } diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/layout/TTLLLayout.java b/logback-classic/src/main/java/ch/qos/logback/classic/layout/TTLLLayout.java new file mode 100755 index 000000000..2d903a0b6 --- /dev/null +++ b/logback-classic/src/main/java/ch/qos/logback/classic/layout/TTLLLayout.java @@ -0,0 +1,61 @@ +package ch.qos.logback.classic.layout; + +import ch.qos.logback.classic.pattern.ThrowableProxyConverter; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.classic.spi.IThrowableProxy; +import ch.qos.logback.core.CoreConstants; +import ch.qos.logback.core.LayoutBase; +import ch.qos.logback.core.util.CachingDateFormatter; + +/** + * A layout with a fixed format. The output is equivalent to that produced by {@link ch.qos.logback.classic.PatternLayout PatternLayout} with the pattern:

+ * + *
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+ * + *

TTLLLayout has the advantage of faster load time whereas {@link ch.qos.logback.classic.PatternLayout PatternLayout} + * requires roughly 40 milliseconds to load its parser classes. Note that the second run of PatternLayout will be much much faster (approx. 10 micro-seconds).

+ * + *

Fixed format layouts such as TTLLLayout should be considered as an alternative to PatternLayout only if the extra 40 milliseconds at application start-up is considered significant.

+ * + * @author Ceki Gülcü + * @since 1.1.6 + */ +public class TTLLLayout extends LayoutBase { + + CachingDateFormatter cachingDateFormatter = new CachingDateFormatter("HH:mm:ss.SSS"); + ThrowableProxyConverter tpc = new ThrowableProxyConverter(); + + @Override + public void start() { + tpc.start(); + super.start(); + } + + @Override + public String doLayout(ILoggingEvent event) { + if (!isStarted()) { + return CoreConstants.EMPTY_STRING; + } + StringBuilder sb = new StringBuilder(); + + long timestamp = event.getTimeStamp(); + + sb.append(cachingDateFormatter.format(timestamp)); + sb.append(" ["); + sb.append(event.getThreadName()); + sb.append("] "); + sb.append(event.getLevel().toString()); + sb.append(" "); + sb.append(event.getLoggerName()); + sb.append(" - "); + sb.append(event.getFormattedMessage()); + sb.append(CoreConstants.LINE_SEPARATOR); + IThrowableProxy tp = event.getThrowableProxy(); + if (tp != null) { + String stackTrace = tpc.convert(event); + sb.append(stackTrace); + } + return sb.toString(); + } + +} diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/util/ContextInitializer.java b/logback-classic/src/main/java/ch/qos/logback/classic/util/ContextInitializer.java index d53e92e8f..d995023ee 100644 --- a/logback-classic/src/main/java/ch/qos/logback/classic/util/ContextInitializer.java +++ b/logback-classic/src/main/java/ch/qos/logback/classic/util/ContextInitializer.java @@ -151,7 +151,6 @@ public class ContextInitializer { } else { Configurator c = EnvUtil.loadFromServiceLoader(Configurator.class); if (c != null) { - System.out.println("loadFromServiceLoader"); try { c.setContext(loggerContext); c.configure(loggerContext); diff --git a/logback-site/src/site/pages/manual/configuration.html b/logback-site/src/site/pages/manual/configuration.html index 775502881..da7c4bbbd 100755 --- a/logback-site/src/site/pages/manual/configuration.html +++ b/logback-site/src/site/pages/manual/configuration.html @@ -101,14 +101,18 @@ classpath..

-
  • If no such file is found, and the executing JVM has the - - ServiceLoader (JDK 6 and above) the ServiceLoader will be used to resolve an - implementation of - com.qos.logback.classic.spi.Configurator. - The first implementation found will be used. - See - ServiceLoader documentation for more details. +

  • If no such file is found, + service-provider loading facility (introduced in JDK 1.6) is + used to resolve the implementation of + com.qos.logback.classic.spi.Configurator + interface by looking up the file + META-INF\services\ch.qos.logback.classic.spi.Configurator + in the class path. Its contents should specify the fully + qualified class name of the desired Configurator + implementation. +

  • If none of the above succeeds, logback configures itself @@ -120,21 +124,28 @@ -

    The fourth and last step is meant to provide a default (but - very basic) logging functionality in the absence of a +

    The last step is meant as last-ditch effort to provide a + default (but very basic) logging functionality in the absence of a configuration file.

    If you are using Maven and if you place the - logback-test.xml under the - src/test/resources folder, Maven will ensure that it - won't be included in the artifact produced. Thus, you can use a - different configuration file, namely logback-test.xml - during testing, and another file, namely, logback.xml, in - production. The same principle applies by analogy for Ant. + logback-test.xml under the src/test/resources + folder, Maven will ensure that it won't be included in the + artifact produced. Thus, you can use a different configuration + file, namely logback-test.xml during testing, and another + file, namely, logback.xml, in production.

    +

    Fast start-up It takes about 100 + miliseconds for Joran to parse a given logback configuration + file. To shave off those miliseconds at aplication start up, you + can use the service-provider loading facility (item 4 above) to + load your own custom Configurator class with BasicConfigrator + serving as a good starting point.

    +

    Automatically configuring logback

    diff --git a/logback-site/src/site/pages/news.html b/logback-site/src/site/pages/news.html index b2fb14ab4..cd3a0e240 100755 --- a/logback-site/src/site/pages/news.html +++ b/logback-site/src/site/pages/news.html @@ -30,9 +30,9 @@
    -

    2016, Release of version 1.1.6

    +

    uary 29th, 2016, Release of version 1.1.6

    -

    LogbackValve (in logback-access) now attempts to +

    LogbackValve (in logback-access) now attempts to load the configuration file as a resource if it cannot be found on the filesystem (LOGBACK-1069). This @@ -63,6 +63,15 @@ by Paulius Matulionis. Analysis of the problem and the relevant PR was provided by Ferenc Palkovics.

    +

    BasicConfigurator.configure method call executes + significatly faster. Improved documentation for configuration + using JDK 1.6 service-provider facility. These changes are in + response to LOGBACK-1141 + requesting faster logback start-up time. +

    + +

    Fixed issue with variable substitution with the value ending in a colon. This problem was reported in LOGBACK-1140 by -- GitLab