Вход в Grails: перезагружаемая внешняя конфигурация с Log4j2 - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь настроить Grails так, чтобы использовать внешние файлы конфигурации Log4j2, разделяющие режим производства и разработки. Он должен прослушивать изменения конфигурации и обновлять его через некоторое время. Для Grails 2.x это можно сделать, зарегистрировав Log4jConfigurer бинов следующим образом:

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 ]

1 голос
/ 18 апреля 2019

с 3.3.3 грааля

Вместо того, чтобы иметь это в коде Java. Конфигурация среды перемещена в файл конфигурации YML.

мы можем передавать различные значения в разные среды и изменять конфигурацию log4j

см. Документацию

документация для конфигурации окружающей среды

0 голосов
/ 21 апреля 2019

Я считаю, что мы можем достичь желаемой потребности с помощью различных подходов. Насколько мне известно об экстернализации файла конфигурации Log4j2 в Grails 3, мы можем использовать либо LogerContext, либо System.setProperty. Последнее может быть сделано в соответствии с инструкциями в сообщении . Мое предложение, а также демонстрация этого вопроса, состоит в том, чтобы использовать LogerContext, как описано в Разделение журналов в Log4j2 руководстве .

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. В этом проекте я попытался записать сообщение после запуска приложения. log.info был назван в Application.groovy. Запустите приложение в Grails 3.3.9, вам нужно будет запустить run-app для тестирования разработки или prod run-app для тестирования производственного режима.

...