У меня есть следующее для моей конфигурации log4j DSL в Grails 1.2:
log4j = {
appenders {
console name: 'stdout', layout: pattern(conversionPattern: conversionPattern)
environments {
production {
// ... some code to determine file path ...
rollingFile name: 'file', file: "${logDirectory}/${appName}.log", layout: pattern(conversionPattern: conversionPattern)
rollingFile name: 'StackTrace', file: "${logDirectory}/${appName}-stacktrace.log"
}
}
environments {
development { root { warn 'stdout' } }
test { root { warn 'stdout' } }
production { root { error 'file' } }
}
// ... package-specific logging configurations ...
}
Когда я развертываюсь как война к Tomcat, мои журналы записаны и в catalina.out и в мой регистратор 'файла', определенный для производства.
Я попробовал:
additivity = false
к root {}
определение для production {}
, который не работает (и я действительно не ожидал бы это к, так как это, по-видимому, устанавливает аддитивность для самого корневого регистратора?).development {}
и test {}
блок в appenders {}
закрытие, но это не работает также.Возможно, это - проблема с моей конфигурацией Tomcat и не моим log4j DSL? Самым близким я пришел к нахождению кого-то с подобной проблемой, является этот поток списка рассылки, для которого не было никакого (простого) решения.
Как я могу препятствовать тому, чтобы журналы были записаны в catalina.out в производстве?
Мне удалось обойти эту проблему, выполнив следующие действия в Config.groovy
:
import org.apache.log4j.Logger
log4j = {
// ... configuration from question ...
}
environments {
production {
def logger = Logger.getRootLogger()
logger.removeAppender('stdout')
}
}
Однако это похоже на грязный взлом, и я надеясь, что есть лучший способ сделать это, специфичный для Grails log4j DSL.
Кроме того, все, что приложение могло бы записать в stdout, вероятно, не будет записано, что может быть плохо, если есть журналы / исключения / трассировки стека, которые каким-то образом записываются непосредственно в stdout.