登录Grails:使用Log4j2重新加载外部配置

时间:2019-04-08 10:25:56

标签: spring spring-boot grails log4j grails3

我正在尝试配置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)?

2 个答案:

答案 0 :(得分:1)

来自grails的3.3.3

而不是使用Java代码。 环境配置已移至YML配置文件。

我们可以将不同的值传递给不同的环境并更改log4j的配置

请参阅文档

documentaion for Enviroment configuration

答案 1 :(得分:0)

我认为我们可以使用不同的方法来实现所需的需求。据我所知,我在Grails 3中将Log4j2配置文件外部化了,我们可以使用LogerContextSystem.setProperty。后者可以按照post中的指示进行。我的建议以及对此问题的演示,都是按照Logging SeparationLog4j2 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.infoApplication.groovy中被调用。在grails 3.3.9中启动该应用程序,您将必须运行run-app来测试开发或运行prod run-app来测试生产模式。