2014-01-23 5 views
1

Я хотел бы вставить файл конфигурации log4j, хранящийся в файле свойств в моем Config.groovy.log4 свойства injection in grails Config.groovy

Вот подам свойства:

log.file=path/to/my/log 
log.root.level=info 
log.grails.app.level=info 

Нет проблем для пути к файлу EL синтаксиса $ {}, но он не работает на уровне, как это не строки. Вот config.groovy:

appenders { 
    file name:'file', file:"${config.log.file}" 
} 

root { 
    ${log.root.level} 'stdout', 'file' 
} 

Любой совет?

ответ

1

Вы должны прочитать файл свойств и преобразовать его в ConfigObject для использования в Config.groovy.

log4j { 
    def props = new Properties() 
    new File("path/to/log.properties").withReader{ 
     props.load(it) 
    } 
    def slurp = new ConfigSlurper().parse(props) 

    appenders { 
     file name:'file', file:"$slurp.log.file" 
    } 

    root { 
     "$slurp.log.root.level" 'stdout', 'file' 
    } 
} 

См. Это similar question.

+0

Спасибо, теперь я могу загрузить свои свойства, но когда сервер запускается, у меня есть ** Исключение возникло при настройке log4j logging: Нет сигнатуры метода: groovy.util.ConfigObject.level() применим для типов аргументов: (java.lang.String, java.lang.String) значения: [stdout, file] ** –

+0

Мой плохой. Пропущенные цитаты. Обновленный ответ. – dmahapatro

+0

Это работает, спасибо. Я не понял точно двойные кавычки trilck, я совершенно новичок в мире Groovy/Grails ... –

0

Если я читаю код в Grails Log4J DSL parser правильно, вы просто должны быть в состоянии сказать

root { 
    "${config.config.log.root.level}" 'stdout', 'file' 
} 

или, если это не работает, то

root { 
    delegate."${config.config.log.root.level}" 'stdout', 'file' 
} 

Обычно, в пределах log4j у вас есть доступ к полному grailsApplication.config (включая опции, объединенные из внешних файлов конфигурации) в качестве переменной config, но похоже, что вам понадобится второй config перед тем, когда вы внутри блока root {}.

Объяснение - закрытие делегат root закрытия является RootLog4jConfig объект, который имеет свойство config, указывающий на основной Log4jConfig, который является делегатом для остальной части log4j закрытия, и что, в свою очередь имеет свою собственность config указывая на разобранный ConfigObject. Я почему-то сомневаюсь, что это поведение преднамеренно, и, возможно, стоит JIRA предположить, что config должен решить одно и то же внутри блока root как вне его.

+0

Я пробовал оба решения. Нет выходных журналов и это сообщение при запуске сервера ** log4j: ERROR Недопустимое свойство при настройке log4j: log ** –

+0

@LaurentBOURGEOIS для работы 'config.', вам нужно будет перечислить файл внешних свойств в' grails.config .locations' –

+0

файл свойств уже находится в моем config.locations 'def envName = System.properties.getProperty (" tomcat.server.name ") grails.config.locations = [" classpath: "+ envName +" - config.properties "]' –

Смежные вопросы