2015-09-01 2 views
22

Ich versuche Logback zu konfigurieren, um E-Mails zu senden, wenn eine Ausnahme (Logging-Ebene: Fehler) auftritt. Ich habe es bisher nicht geschafft, also bitte ich um Ihre Hilfe bei der Konfiguration.Spring Boot - Senden von E-Mails mit Logback

Ich habe eine Feder Boot-Anwendung, wo ein Teil der Verarbeitung durchgeführt wird:

private void foo() { 
try { 
    // do something 
} catch (Exception e) { 
    log.error("Logging my exception"); 
} 
} 

Ich möchte eine E-Mail ausgelöst werden, wenn dieser Fehler protokolliert wird. Ich folgte einige tutorials und ich fügte logback.xml und smtp-appender.xml meiner resources Verzeichnis:

logback.xml

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <include resource="org/springframework/boot/logging/logback/base.xml" /> 
    <include resource="smtp-appender.xml" /> 
    <logger name="com.mycompany" level="DEBUG"> 
     <appender-ref ref="SMTP" /> 
    </logger> 
</configuration> 

smtp-appender.xml

<?xml version="1.0" encoding="UTF-8"?> 

<included> 
    <appender name="SMTP" class="ch.qos.logback.classic.net.SMTPAppender"> 
     <smtpHost>xxx</smtpHost> 
     <username>user</username> 
     <password>password</password> 

     <to>[email protected]</to> 
     <from>[email protected]</from> 
     <subject>testError</subject> 

     <layout class="ch.qos.logback.classic.html.HTMLLayout" /> 

    </appender> 
</included> 

ich habe Setup lokale smtpserver auf localhost über sendmail. Ich habe auch mit AWS SMTP-Server und Gmail versucht. Keiner dieser Dienste funktionierte für mich bisher.

Das Problem ist, dass ich nach der Ausnahme keine E-Mails erhalten und es gibt buchstäblich keine Ausgabe entsprechend dem Logback (neben der log.error() Ausgabe, natürlich), die mich denken, dass die Anwendung nicht einmal über diese Konfiguration weiß Dateien ...

Das sind meine maven-Abhängigkeiten in pom.xml:

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.2.5.RELEASE</version> 
    <relativePath /> 
    <!-- lookup parent from repository --> 
</parent> 
<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <java.version>1.8</java.version> 
</properties> 
<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-actuator</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.projectlombok</groupId> 
     <artifactId>lombok</artifactId> 
     <version>1.16.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-test</artifactId> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.json</groupId> 
     <artifactId>json</artifactId> 
     <version>20141113</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.mail</groupId> 
     <artifactId>mail</artifactId> 
     <version>1.4</version> 
    </dependency> 
</dependencies> 

Jede Hilfe sehr geschätzt werden würde.

+0

ich sehe nicht die ** Java Beans Aktivierung Rahmen ** in Ihrem pom enthalten und es ist notwendig, Mail über die Protokollierung senden – Deh

+0

ich die Abhängigkeit zu pom hinzugefügt: http://mvnrepository.com/artifact /javax.activation/activation/1.1.1 aber es löst nicht das Problem – Smajl

+0

weder Logback noch slf4j sind enthalten – Deh

Antwort

1

Standardeintrag für den Port in smtpappender 25, gmail-Authentifizierung für SMTP-Dienste verwendet, und Sie müssen Ports 587 für TLS und 465 für SSL verwenden.

Ich würde sagen, das könnte Ihr Problem sein.

Versuchen Sie Setup-Mail-Server auf dem lokalen Rechner zunächst ohne Authentifizierung und versuchen Ihr beigefügten funktioniert. dann versuchen Sie zu finden, wie Sie es für Google Mail konfigurieren.

Von Seite http://logback.qos.ch/manual/appenders.html#gmailSTARTTLS

SMTPAppender für Gmail (STARTTLS)

<configuration> 
    <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender"> 
    <smtpHost>smtp.gmail.com</smtpHost> 
    <smtpPort>587</smtpPort> 
    <STARTTLS>true</STARTTLS> 
    <username>[email protected]</username> 
    <password>YOUR_GMAIL_xPASSWORD</password> 

    <to>EMAIL-DESTINATION</to> 
    <to>ANOTHER_EMAIL_DESTINATION</to> <!-- additional destinations are possible --> 
    <from>[email protected]</from> 
    <subject>TESTING: %logger{20} - %m</subject> 
    <layout class="ch.qos.logback.classic.PatternLayout"> 
     <pattern>%date %-5level %logger - %message%n</pattern> 
    </layout>  
    </appender> 

    <root level="DEBUG"> 
    <appender-ref ref="EMAIL" /> 
    </root> 
</configuration> 
+0

Ich habe versucht, die E-Mail von localhost zu senden (ich habe den sendmail SMTP Server lokal eingerichtet), aber es hat auch nicht funktioniert. Ich glaube, dass das Problem nicht darin besteht, Ports und Host-Konfiguration zu spezifizieren, sondern in der gesamten Integration im Allgemeinen ... – Smajl

+0

@Smajl vielleicht, mit der Konfiguration, die Sie hatten, würde ich sowieso nicht arbeiten. Wenn Sie denken, dass es ein Problem mit der Integration ist, versuchen Sie, Ihre Anwendung zu überprüfen, ob alles an appender übergeben wird und welche Magie dort passiert. – user902383

2

Pls umfassen folgende (aus meinem Arbeitsprojekt) auf pom.xml & logback.xml um Fehler Mail zu erhalten: -

pom.xml

<dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.6.4</version> 
    </dependency> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-classic</artifactId> 
     <version>1.0.1</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>jcl-over-slf4j</artifactId> 
     <version>1.6.4</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.mail</groupId> 
     <artifactId>mail</artifactId> 
     <version>1.4</version> 
    </dependency> 

logback.xml

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <appender name="errMailer" class="ch.qos.logback.classic.net.SMTPAppender"> 
     <smtpHost>xxx</smtpHost> 
     <smtpPort>25</smtpPort> 
     <from>[email protected]</from> 
     <to>[email protected]</to> 
     <subjectStr>App Err Mail</subjectStr> 
     <layout class="ch.qos.logback.classic.html.HTMLLayout"/> 
     <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
      <level>ERROR</level> 
     </filter> 
    </appender> 
    <root level="ERROR"> 
     <appender-ref ref="errMailer" /> 
    </root> 
</configuration> 
+0

Vielen Dank für Ihre Antwort, aber dies löst das Problem nicht. – Smajl

+1

Dies ist ein funktionierender Code aus meinem aktiven Projekt. Bitte teilen Sie Details darüber, welches Problem Sie haben, nachdem Sie dies mit Unterstützung von stacktrace unterstützt haben. – Avis

+0

Nicht sicher, was zu enthalten ist ... Ich habe Ihren Code verwendet und die Fehlermeldung wurde in der Konsole angezeigt, aber keine E-Mail wurde ausgelöst (oder es wurde ausgelöst, aber ich habe es nicht erhalten). Was meinst du mit "unterstützender Fehler StackTrace?" Ich benutze level: DEBUG, die ERRORs unterstützt – Smajl

0

Sie haben Marker basierend damit der E-Mail auslösen.

umfassen einen Auswerter in Ihrem logback.xml unter SMTP appender untenstehenden Link siehe

http://logback.qos.ch/manual/appenders.html#OnMarkerEvaluator

dann unter Logik in Ihrem Ausnahme catch-Block hinzufügen, übergeben Marker Objekt Logger Methode, wenn Sie E-Mail senden möchten unten wie -

Marker notifyAdmin = MarkerFactory.getMarker("NOTIFY_ADMIN"); 
logger.error(notifyAdmin, 
    "This is a serious an error requiring the admin's attention", 
    new Except 
ion("Just testing")); 

ihre möglich, dass Sie in einigem Szenario nicht E-Mail senden und wollen nur die Ausnahme protokollieren dann nicht nur Marker-Objekt-Logger-Methode übergeben.

logger.error("This is a serious an error requiring the admin's attention", 
    new Except 
ion("Just testing"));