2

我正在编写一个简单的 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)
    }
}

然后我所有需要进行日志记录的类都继承自BaseClass.

通过这种方式,我可以为每个环境指定不同的文件名,然后我可以从那里读取日志配置。但它似乎有很多样板,并迫使我使用可能不理想的层次结构。

另一方面,在这里我看到我可以获得一个带有简单注释的记录器。

有没有办法根据环境获取不同的记录器 - 可以在运行时设置?

4

2 回答 2

6

基于 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"
   }
}

然后让你的脚本使用它:

@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()
    }
}

最后,使用系统属性中的环境启动您的程序:

groovy -Denv=prod Test.groovy
于 2012-07-16T19:45:51.660 回答
3

您应该能够简单地将log4j.properties文件放在类路径中。

鉴于此测试脚本:

@groovy.util.logging.Log4j
class Test {
  def dosome() {
    log.info( 'Logging!' )
  }

  static main( args ) {
    new Test().dosome()
  }
}

如果我从命令行运行它:

groovy -cp log4j-1.2.17.jar Test.groovy

它不打印任何内容,因为默认情况下它没有设置为记录 INFO 消息。

但是,如果我编写一个 log4j.properties 文件(取自 log4j 的文档并更改为 log ):

log4j.rootLogger=DEBUG, A1

log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout

# Print the date in ISO 8601 format
log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

然后在类路径中使用此属性文件再次运行它:

groovy -cp log4j.properties:log4j-1.2.17.jar Test.groovy 

我们得到:

2012-07-16 16:08:47,524 [main] INFO  Test - Logging!
于 2012-07-16T14:09:02.500 回答