And*_*rea 2 groovy logging log4j
我正在编写一个简单的Groovy应用程序,需要进行一些日志记录.记录事物的实际属性取决于特定环境.例如,在开发时我只想登录到控制台,在测试和生产中我可能想要写入文件,在生产中我可能想要发送最严重事件的电子邮件.
现在我正在做的事情看起来像这样:
import org.apache.log4j.Logger
import org.apache.log4j.PropertyConfigurator
class BaseClass {
protected config
static Logger logger = Logger.getLogger(BaseClient.class)
def BaseClass(env) {
def configFilePath = // whatever
config = new JsonSlurper().parseText(configFile.text)[options.env]
def logConfigFilePath = ['somelogdir', config.log_file].join(File.separator)
PropertyConfigurator.configure(logConfigFilePath)
}
}
Run Code Online (Sandbox Code Playgroud)
然后我需要进行日志记录的所有类都继承自BaseClass.
通过这种方式,我可以为每个环境指定不同的文件名,然后从那里读取日志记录配置.但它似乎有很多样板,并迫使我使用可能不理想的层次结构.
另一方面,在这里我看到我可以获得一个带有简单注释的记录器.
有没有办法根据环境获得不同的记录器 - 可以在运行时设置?
在tim_yates的答案的基础上,使用groovy文件配置log4j.例如:
// log4j.groovy
log4j {
rootLogger="DEBUG, A1"
appender.A1 = "org.apache.log4j.ConsoleAppender"
appender.'A1.layout' = "org.apache.log4j.PatternLayout"
if (System.properties['env'] == 'prod') {
appender.'A1.layout.ConversionPattern'="prod %-4r [%t] %-5p %c %x - %m%n"
} else {
appender.'A1.layout.ConversionPattern'="dev %-4r [%t] %-5p %c %x - %m%n"
}
}
Run Code Online (Sandbox Code Playgroud)
然后让你的脚本使用它:
@GrabConfig(systemClassLoader=true)
@Grab(group='log4j', module='log4j', version='1.2.17')
import groovy.util.logging.Log4j
import org.apache.log4j.PropertyConfigurator
@Log4j
class Test {
def dosome() {
log.info('Logging!')
}
static main( args ) {
def config = new ConfigSlurper().parse(new File('log4j.groovy').toURL())
PropertyConfigurator.configure(config.toProperties())
new Test().dosome()
}
}
Run Code Online (Sandbox Code Playgroud)
最后,在系统属性中使用环境启动程序:
groovy -Denv=prod Test.groovy
Run Code Online (Sandbox Code Playgroud)