如何在groovy上配置Logback SMTP appender?

如何在groovy上配置Logback SMTP appender?,groovy,logback,Groovy,Logback,我正在尝试使用Groovy为我的独立Java应用程序配置Logback SMTP appender。我的logback.groovy文件内容如下: import ch.qos.logback.classic.PatternLayout import ch.qos.logback.classic.encoder.PatternLayoutEncoder import ch.qos.logback.classic.net.SMTPAppender import ch.

我正在尝试使用Groovy为我的独立Java应用程序配置Logback SMTP appender。我的logback.groovy文件内容如下:

    import ch.qos.logback.classic.PatternLayout
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder
    import ch.qos.logback.classic.net.SMTPAppender
    import ch.qos.logback.core.ConsoleAppender

    import static ch.qos.logback.classic.Level.INFO

    def common_log_date_format = "{MM/dd HH:mm:ss:SSS}"
    def common_log_conversionpattern = "[%d${common_log_date_format}] [%t] [%c{0}] [%p]: %m%n"

    appender("STDOUT", ConsoleAppender) {
      encoder(PatternLayoutEncoder) {
        pattern = "${common_log_conversionpattern}"
      }
    }

    appender("EMAIL", SMTPAppender) {
      smtpHost = "xxxx"
      to = "yyyy"
      from = "zzzz"
      subject = "[${app.name}] [%marker] [%p]"
      asynchronousSending = false
      layout(PatternLayout) {
        pattern = "${common_log_conversionpattern}"
      }
    }

    root(INFO, ["STDOUT", "EMAIL"])
但此配置不起作用,它在应用程序启动期间失败,原因是:

Failed to instantiate [ch.qos.logback.classic.LoggerContext]
Reported exception:
java.lang.NullPointerException: Cannot get property 'name' on null object
at org.codehaus.groovy.runtime.NullObject.getProperty(NullObject.java:56)
at org.codehaus.groovy.runtime.InvokerHelper.getProperty(InvokerHelper.java:168)
at org.codehaus.groovy.runtime.callsite.NullCallSite.getProperty(NullCallSite.java:44)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:227)
at Script1$_run_closure2.doCall(Script1.groovy:22)
at Script1$_run_closure2.doCall(Script1.groovy)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:909)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:39)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:54)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112)
at ch.qos.logback.classic.gaffer.ConfigurationDelegate.appender(ConfigurationDelegate.groovy:141)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
at org.codehaus.groovy.runtime.metaclass.MixinInstanceMetaMethod.invoke(MixinInstanceMetaMethod.java:53)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoMetaMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:313)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:52)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:149)
at Script1.run(Script1.groovy:18)
at Script1$run.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112)
at ch.qos.logback.classic.gaffer.GafferConfigurator.run(GafferConfigurator.groovy:64)
at ch.qos.logback.classic.gaffer.GafferConfigurator$run.callCurrent(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141)
at ch.qos.logback.classic.gaffer.GafferConfigurator.run(GafferConfigurator.groovy:40)
at ch.qos.logback.classic.gaffer.GafferUtil.runGafferConfiguratorOn(GafferUtil.java:43)
at ch.qos.logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:65)
at ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:148)
at org.slf4j.impl.StaticLoggerBinder.init(StaticLoggerBinder.java:85)
at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:55)
at org.slf4j.LoggerFactory.bind(LoggerFactory.java:128)
at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:107)
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:295)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:269)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:281)
at com.revere.edm.job.Loader.<init>(Loader.java:13)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at java.lang.Class.newInstance(Class.java:374)
at com.revere.shell.Shell.execute(Shell.java:233)
at com.revere.shell.Shell.main(Shell.java:64)
实例化[ch.qos.logback.classic.LoggerContext]失败
报告的例外情况:
java.lang.NullPointerException:无法获取null对象的属性“name”
位于org.codehaus.groovy.runtime.NullObject.getProperty(NullObject.java:56)
位于org.codehaus.groovy.runtime.InvokerHelper.getProperty(InvokerHelper.java:168)
位于org.codehaus.groovy.runtime.callsite.NullCallSite.getProperty(NullCallSite.java:44)
位于org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:227)
在Script1$\u run\u closure2.doCall(Script1.groovy:22)
在Script1$\u运行\u closure2.doCall(Script1.groovy)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:606)
位于org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
位于groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
位于org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
位于groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:909)
位于org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:39)
位于org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
位于org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:54)
位于org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112)
位于ch.qos.logback.classic.gaffer.ConfigurationDelegate.appender(ConfigurationDelegate.groovy:141)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:606)
位于org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
位于org.codehaus.groovy.runtime.metaclass.MixinInstanceMetaMethod.invoke(MixinInstanceMetaMethod.java:53)
位于org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$pogometamethodsiteNounwrapnocerc.invoke(PogoMetaMethodSite.java:313)
位于org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:52)
位于org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)
位于org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133)
位于org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:149)
在Script1.run(Script1.groovy:18)
在Script1$run.call时(未知源)
位于org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
位于org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
位于org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112)
在ch.qos.logback.classic.gaffer.GafferConfigurator.run(GafferConfigurator.groovy:64)
位于ch.qos.logback.classic.gaffer.GafferConfigurator$run.callCurrent(未知源)
位于org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)
位于org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133)
位于org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141)
在ch.qos.logback.classic.gaffer.GafferConfigurator.run(GafferConfigurator.groovy:40)
在ch.qos.logback.classic.gaffer.GafferUtil.runGafferConfiguratorOn(GafferUtil.java:43)
位于ch.qos.logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:65)
在ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:148)中
位于org.slf4j.impl.StaticLoggerBinder.init(StaticLoggerBinder.java:85)
位于org.slf4j.impl.StaticLoggerBinder。(StaticLoggerBinder.java:55)
位于org.slf4j.LoggerFactory.bind(LoggerFactory.java:128)
在org.slf4j.LoggerFactory.performinization上(LoggerFactory.java:107)
位于org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:295)
位于org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:269)
位于org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:281)
位于com.revere.edm.job.Loader(Loader.java:13)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:526)
位于java.lang.Class.newInstance(Class.java:374)
位于com.revere.shell.shell.execute(shell.java:233)
位于com.revere.shell.shell.main(shell.java:64)
我无法理解此消息的原因。如果我从配置中删除SMTP Appender配置部分,则应用程序可以正常工作并记录日志。 如何使SMTP Append与groovy配置一起工作


我的环境是:Ubuntu 12.04,logback classic/core 1.0.13,Groovy all-jar版本2.2.0-rc-3,Janino 2.6.1,javax.mail 1.4。

好的,我发现了我的错误。app.name是包含的配置中的一个属性,在将配置更新到groovy后未包含该属性。问题已解决。

这是我针对groovy&grails 3.2.0 appender和smtp gmail的解决方案,用于测试和生产环境:

import grails.util.BuildSettings
import grails.util.Environment
import ch.qos.logback.classic.html.HTMLLayout
import ch.qos.logback.classic.encoder.PatternLayoutEncoder
import ch.qos.logback.classic.net.SMTPAppender
import ch.qos.logback.core.ConsoleAppender

// See http://logback.qos.ch/manual/groovy.html for details on configuration
appender('STDOUT', ConsoleAppender) {
    encoder(PatternLayoutEncoder) {
        pattern = "%level %logger - %msg%n"
    }
}

appender("EMAIL", SMTPAppender) {
    smtpHost = "smtp.gmail.com"
    smtpPort = 587
    STARTTLS = true
    username = "email@gmail.com"
    password = "password"
    to = "emailRecepter@domain.com"
    from = "email@gmail.com"
    subject = "Logback Sam error"
    asynchronousSending = false
    layout(HTMLLayout) {
        pattern = "%level %logger - %msg%n"
    }
    println "Setting EMAIL property"
}

def targetDir = BuildSettings.TARGET_DIR
if (Environment.isDevelopmentMode() && targetDir != null) {
    appender("FULL_STACKTRACE", FileAppender) {
        file = "${targetDir}/stacktrace.log"
        append = true
        encoder(PatternLayoutEncoder) {
            pattern = "%level %logger - %msg%n"
        }
    }
    logger("StackTrace", ERROR, ['FULL_STACKTRACE'], false)
    root(ERROR, ['STDOUT', 'FULL_STACKTRACE'])

}
else {
    root(ERROR, ['STDOUT','EMAIL'])
}

什么是
app
subject=“[${app.name}][%marker][%p]”
@tim_-yates可能是从Grails代码中获得的