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 に答える