我正在编写一个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的内容和它的其他包含文件,看看如何手动复制它,但它会添加一些我想避免的样板代码。
感谢您提供的任何帮助。
答案 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相反:
现成的Groovy无法使用您可以在配置文件中使用XML进行的所有操作, 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核心。