2012-07-16 65 views
2

我在寫一個簡單的Groovy應用程序,需要做一些日誌記錄。事物記錄方式的實際屬性取決於特定的環境。例如,在開發過程中,我只想登錄到控制檯,在測試和生產過程中,我可能想要寫入一個文件,而在生產中,我可能想發送最嚴重事件的電子郵件。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繼承。

通過這種方式,我可以爲每個環境指定一個不同的文件名,然後從那裏讀取日誌配置文件。但似乎很多樣板,並迫使我使用可能不理想的層次結構。

另一方面,here我看到我可以通過簡單的註釋獲取記錄器。

有沒有辦法根據環境獲取不同的記錄器 - 可以在運行時設置?

回答

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 
+1

'PropertyConfigurator.configure(config.toProperties()) '行會全局應用於所有記錄器嗎?因爲不然的話,這就是我在我的問題中已經做的事情,而且問題就在於我不想在所有需要日誌記錄的類中都有這些行 – Andrea 2012-07-17 07:12:59

+1

是的,調用'PropertyConfigurator.configure'將配置所有記錄器。沒有必要在每個班級都做。一旦開始就足夠了。 – ataylor 2012-07-17 14:34:21

+0

任何人都知道如何做相當於log4j2?谷歌搜索尚未指出答案。 – user944849 2016-11-08 14:59:08

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文件(taken from the docs for log4j和改變登錄):

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 

然後再次運行這個特性在classpath文件:

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

我們得到:

2012-07-16 16:08:47,524 [main] INFO Test - Logging! 
+1

謝謝你,但我的問題是**不是**根據環境獲取不同的文件名。即使沒有這種誹謗,那也是一件容易的事。我無法做的是將此配置提供給Log4j。我可以用給定的配置文件創建和使用記錄器,就像我在我的例子中那樣,但是我必須爲需要記錄的每個類執行此操作。或者我需要讓它們從一個普通的類繼承。 – Andrea 2012-07-16 14:47:36

+0

換句話說,假設我可以通過任何方式(例如JSONSlurper或ConfigSlurper)來獲取一組屬性。我如何告訴Log4j一勞永逸地使用該配置,即使對於已經創建的記錄器實例,也可以通過註釋來說明? – Andrea 2012-07-16 14:52:36

+0

@Andrea啊,我看到我得到了棒的錯誤結局;-)我會有一個想法... – 2012-07-16 14:54:39