如何在logback.groovy

时间:2015-07-16 03:37:09

标签: groovy spring-boot logback

我正在编写一个Spring Boot应用程序,需要使用Groovy灵活地控制我的logback配置。在Spring Boot中,我所要做的就是创建src / main / resources / logback.groovy,它会自动用于配置。

我想做的是从Spring Boot的默认logback配置开始,只需根据需要覆盖或修改设置。

如果我使用logback.xml而不是logback.groovy,我可以执行以下操作。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <logger name="org.springframework.web" level="DEBUG"/>
</configuration>

有什么类似于上面的include行,我可以在logback.groovy中使用吗?我可以查看base.xml的内容和它的其他包含文件,看看如何手动复制它,但它会添加一些我想避免的样板代码。

感谢您提供的任何帮助。

4 个答案:

答案 0 :(得分:5)

有一个在线tool可将给定的logback.xml文件转换为等效的logback.groovy。在你的情况下,它导致:

//
// Built on Thu Jul 16 09:35:34 CEST 2015 by logback-translator
// For more information on configuration files in Groovy
// please see http://logback.qos.ch/manual/groovy.html

// For assistance related to this tool or configuration files
// in general, please contact the logback user mailing list at
//    http://qos.ch/mailman/listinfo/logback-user

// For professional support please see
//   http://www.qos.ch/shop/products/professionalSupport

import static ch.qos.logback.classic.Level.DEBUG

logger("org.springframework.web", DEBUG)

<include> not supported用于常规配置。

答案 1 :(得分:1)

您如何看待而不是添加/覆盖您的配置,再次重新加载?

您可以创建一个Spring Bean,查看一个回溯文件是否在您指定的位置,如果是,则使用该文件重新加载

实施例

@Component
public class LoggingHelper {

    public static final String LOGBACK_GROOVY = "logback.groovy";

    @PostConstruct
    public void resetLogging() {
        String configFolder = System.getProperty("config.folder");
        Path loggingConfigFile = Paths.get(configFolder, LOGBACK_GROOVY);
        if (Files.exists(loggingConfigFile) && Files.isReadable(loggingConfigFile)) {

            LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
            ContextInitializer ci = new ContextInitializer(loggerContext);
            loggerContext.reset();
            try {
                ci.configureByResource(loggingConfigFile.toUri().toURL());
            } catch (JoranException e) {
                // StatusPrinter will handle this
            } catch (MalformedURLException e) {
                System.err.println("Unable to configure logger " + loggingConfigFile);
            }
            StatusPrinter.printInCaseOfErrorsOrWarnings(loggerContext);
        }
    }

}

答案 2 :(得分:0)

我正在使用此代码段来启动我的logback.groovy文件

import ch.qos.logback.classic.joran.JoranConfigurator
import org.xml.sax.InputSource

def configurator = new JoranConfigurator()
configurator.context = context
def xmlString = '<?xml version="1.0" encoding="UTF-8"?>\n<configuration>\n    <include resource="org/springframework/boot/logging/logback/base.xml"/>\n</configuration>'
configurator.doConfigure(new InputSource(new StringReader(xmlString)))

答案 3 :(得分:0)

documentation相反:

您可以在配置文件中使用XML进行的所有操作, Groovy的语法短得多。

现成的Groovy无法使用

include。但是,由于bug ticket于2014年启用,因此有两种解决方法。我将它们包括在这里(略作编辑),但所有功劳归功于原始JIRA错误的“ Yih Tsern”:

logback.groovy

include(new File('logback-fragment.groovy'))

root(DEBUG, ["CONSOLE"])

def include(File fragmentFile) {
  GroovyShell shell = new GroovyShell(
    getClass().classLoader,
    binding,
    new org.codehaus.groovy.control.CompilerConfiguration(scriptBaseClass: groovy.util.DelegatingScript.name))

  Script fragment = shell.parse(fragmentFile.text)
  fragment.setDelegate(this)

  fragment.run()
}

logback-fragment.groovy:

// NOTE: No auto-import
import ch.qos.logback.core.*
import ch.qos.logback.classic.encoder.*

appender("CONSOLE", ConsoleAppender) {
  encoder(PatternLayoutEncoder) {
    pattern = "%d [%thread] %level %mdc %logger{35} - %msg%n"
  }
}

鉴于解决方法和添加功能的请求,我不确定为什么尚未将功能添加到Logback核心。