如何在 logback.groovy 中包含 xml 配置

How can I include xml configuration in logback.groovy

我正在编写 Spring 启动应用程序,需要使用 Groovy 灵活地控制我的 logback 配置。在 Spring 引导中,我所要做的就是创建 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>

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

感谢您提供的任何帮助。

有一个在线 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> 时,groovy 配置是 not supported

您如何看待 adding/overriding 您的配置,您重新加载它?

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

示例

@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);
        }
    }

}

我正在使用这个片段来启动我的 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)))

documentation 的说法相反:

Everything you can do using XML in configuration files, you can do in Groovy with a much shorter syntax.

include 无法使用开箱即用的 Groovy。然而,多亏了 2014 年开放的 bug ticket,有几个解决方法。我将它们包括在这里(略有编辑),但所有功劳归于 "Yih Tsern" 来自原始 JIRA 错误:

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 核心。