如何在 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 核心。
我正在编写 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 核心。