将Log4J appender注入Grails应用程序

Nox*_*lle 5 grails log4j

我正在制作一个简单的grails插件,它将作为我们公司各种项目日志记录的中心配置.一般的想法是,您只需将插件添加到项目中,它就会将各种appender注入根记录器.我首先使用Graylog2 appender测试它(如果我只是在Config.groovy中配置它,它就可以工作).这是我尝试过的代码(在BootStrap.groovy的init()中[在启动时执行]:

    def rL = Logger.rootLogger
    def layout = new PatternLayout(conversionPattern: '%d{dd-MM-yyyy HH:mm:ss,SSS} %5p %c{1} - %m%n')

    Appender appender = new org.graylog2.log.GelfAppender(
            name:"gelf",
            graylogHost:"graylog2.ourcompany.com",
            extractStacktrace: true,
            addExtendedInformation: true,
            facility: "gelf-java",
            threshold: org.apache.log4j.Level.INFO,
            additionalFields: "{'runtime': 'grails', 'environment': 'dev', 'transport': 'gelf-java'}",
            layout: layout
    )
    rL.addAppender(appender)
Run Code Online (Sandbox Code Playgroud)

appender被正确实例化并附加到根记录器,这里是从rL.getAllAppenders().toList()输出的.每个{print it.toString()}:

org.codehaus.groovy.grails.plugins.log4j.appenders.GrailsConsoleAppender@7a054197
org.graylog2.log.GelfAppender@6f155f16
Run Code Online (Sandbox Code Playgroud)

因此,尽管将Appender添加到根记录器,并将错误级别的消息写入日志(并显示到默认的Console Logger),但它根本不会将消息发送到Graylog2(我已使用Wireshark检查了验证这一点).如果我只是在另一个项目的Config.groovy中设置值,这可以正常工作; 但显然这违背了这个插件的目的.

Ian*_*rts 1

activateOptions()在将附加程序添加到根记录器之前,您需要调用它。当您配置附加程序时,Grails 会为您执行此操作,这Config.groovy就是它在那里工作的原因。