我正在尝试配置Grails,以便使用将生产和开发模式分开的外部Log4j2配置文件。它应该侦听配置更改,并在一段时间后刷新它。
对于Grails 2.x,可以这样注册Log4jConfigurer
bean:
switch (Environment.current) {
case Environment.PRODUCTION:
log4jConfigurer(MethodInvokingFactoryBean) {
targetClass = "org.springframework.util.Log4jConfigurer"
targetMethod = "initLogging"
arguments = ["classpath:ogc-log4j.xml", 30000]
}
case Environment.DEVELOPMENT:
log4jConfigurer(MethodInvokingFactoryBean) {
targetClass = "org.springframework.util.Log4jConfigurer"
targetMethod = "initLogging"
arguments = ["classpath:log4j-dev.xml", 30000]
}
}
由于某些原因,这种方法在Grails 3.x中不起作用。我该如何在Grails 3.3.3或Spring Boot中做到这一点(我猜它应该可以工作,因为Grails 3.x基于Spring Boot)?
答案 0 :(得分:1)
来自grails的3.3.3
而不是使用Java代码。 环境配置已移至YML配置文件。
我们可以将不同的值传递给不同的环境并更改log4j的配置
请参阅文档
答案 1 :(得分:0)
我认为我们可以使用不同的方法来实现所需的需求。据我所知,我在Grails 3中将Log4j2
配置文件外部化了,我们可以使用LogerContext
或System.setProperty
。后者可以按照post中的指示进行。我的建议以及对此问题的演示,都是按照Logging Separation的Log4j2 manual部分所述使用LogerContext
。
import org.apache.logging.log4j.LogManager
import org.apache.logging.log4j.core.LoggerContext
class BootStrap {
def init = { servletContext ->
LoggerContext context = (LoggerContext) LogManager.getContext(false)
String userHome = System.getProperty("user.home")
String pathname = ""
if (grails.util.Environment.isDevelopmentMode()) {
pathname = userHome + "/.myConfigurations/log4j2-dev.xml"
} else {
pathname = userHome + "/.myConfigurations/log4j2-prod.xml"
}
File file = new File(pathname)
// this will force a reconfiguration
context.setConfigLocation(file.toURI())
}
}
请查看上传到Bitbucket的my project。在这个项目中,我尝试在启动应用程序后记录一条消息。 log.info
在Application.groovy
中被调用。在grails 3.3.9中启动该应用程序,您将必须运行run-app
来测试开发或运行prod run-app
来测试生产模式。