1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

SMTPAppender bei Log4j

Discussion in 'Programmieren' started by Miriam1990, Oct 2, 2009.

Thread Status:
Not open for further replies.
  1. Miriam1990

    Miriam1990 Byte

    Hallo,
    Ich versuche gerade einen SMTPAppender zu erstellen. Bei anderen Appendern hab ich das mit ner *.conf Datei hinbekommen.
    Also sowas:

    Code:
    PropertyConfigurator.configure("test.conf");
    Aber den SMTPAppender will er so irgendwie nicht erkennen.. Deswegen wollt ichs jetzt komplett direkt im Java code machen (mit settern).

    Code:
    Logger logger = Logger.getLogger(LogTest2.class);		
    
    	PatternLayout layout= new PatternLayout ();
    				
    	SMTPAppender emailAppender = new SMTPAppender();
    	emailAppender.setLayout(layout);
    		
    	emailAppender.setSMTPHost("http://mail.google.com");
    	emailAppender.setFrom("Dechert.Miriam@googlemail.com");
    	emailAppender.setTo("MiriamDechert@web.de");
    	emailAppender.setTo("Miriam.Dechert@gmx.de");
    	emailAppender.setBufferSize(1);
    	emailAppender.setSubject("Hallo...");
    	emailAppender.activateOptions(); 
    		
    	logger.addAppender (emailAppender);
    Aktuelles Problem ist jetzt: Hier kann man keinen Port angeben! „.setSMTPPort“ ist bei den conf dateien vorhanden, aber dort nicht x.x Wie krieg ich da jetzt trotzdem nen Port hin?? ó.o
     
  2. Miriam1990

    Miriam1990 Byte

    Nachtrag:
    ok, es scheint so, als geht es weder mit *.xml noch mit *.conf noch mit settern. ich bekomme bei allen 3 varianten diesen Fehler:

    Code:
    log4j:WARN No such property [SMTPPort] in org.apache.log4j.net.SMTPAppender.
    aber das widerspricht der Angabe dieser homepage, wo 'smtpport' eindeutig als property aufgelistet wird:
    http://logback.qos.ch/manual/appenders.html

    und wie soll ich sonst dort einen port hinbekommen!?
    Hab hier noch ne homepage gefunden, wo welche wohl ne Lösung gefunden haben. Nur leider is mir nicht ganz klar, was die gemacht haben x.x
    http://www.coderanch.com/t/62833/Other-Open-Source-Projects/Email-Logging-With-Non-Default

    wär echt dankbar, wenn da jemand ne idee hätte bzw mir detaillierter erklären könnte, was die 2 jungs in dem anderen forum gemacht haben
     
  3. daboom

    daboom Megabyte

    Aber nur weil Du ein Mädel bist :D

    Also im ersten Link von Dir geht es, soweit ich das verstanden habe, nicht direkt um log4j sondern um LogBack. Ist zwar offenbar fast das gleiche, würde aber erklären, warum log4j den SMTPPort beim SMTPAppender nicht kennt.

    Das unterstreicht auch der zweite Link, wo der gute Mensch dort ja den SMTPPort nachimplementiert hatte.

    Also hast Du jetzt zwei Möglichkeiten, würde ich sagen:

    1. Du benutzt LogBack anstatt log4j
    2. Du machst es wie im zweiten Link und extendest den log4j SMTPAppender

    Wenn Du weitere Fragen zu einer der beiden Möglichkeiten hast, kannste die natürlich gerne stellen ;)
     
  4. Miriam1990

    Miriam1990 Byte

    Is doch immer wieder gut, weiblich zu sein :baeh:

    Mittlerweile gehts jetzt irgendwie, ohne dass ich nen Port angegeben hab. Warum auch immer.. Naja wahrscheinlich ist der Port halt doch 25 -.- (25 wird ja automatisch genommen)

    Aber ich fänds trotzdem ganz interessant, zu kapieren, was die da bei dem 2. Link reden. Außerdem werd ich am Ende eh an ne andere Addy schicken und da kann ich das Problem dann wieder kriegen.

    Also von was wollen die da ihr eigenes schreiben? Schreiben die nen eigenen SMTPAppender? Was heißt das genau: "You just have to subclass the SMTPAppender class" ?
     
  5. daboom

    daboom Megabyte

    Naja halt ein von der SMTPAppender-Klasse abgeleitete Klasse schreiben und dort die Funktionalität mit dem Port dazuprogrammieren.
     
  6. Miriam1990

    Miriam1990 Byte

    hm okay ich glaub ich kanns mir ungefähr vorstellen, aber da es aktuell ja funktioniert bin ich zu faul es auszuprobieren xD
    trotzdem danke^^
     
  7. Miriam1990

    Miriam1990 Byte

    hmm hab da jetzt noch n problemchen. wenn keine Internetverbindung besteht, dann kann der keine E-Mail senden und es gibt ne Fehlermeldung. Die will ich aber auffangen und dann halt selber n userverständliches Sätzchen ausgeben.
    Der Fehler tritt immer auf, wenn man über den Aufruf mail_Logger.error("Fehlermeldung.."); eine Mail schicken will, is ja logisch. Aber selbst, wenn ich versuche das mit throwable aufzufangen, funktioniert das nicht.

    http://www.tutorials.de/forum/java/334262-log4j-debug-meldungen-aus-externen-jars-unterdruecken.html
    dieses Forum lässt mich vermuten, dass vllt durch meine jar-Files von log4j diese Meldung gesendet wird. Allerdings arbeite ich nicht mit einem property-file, sondern mit settern/gettern im quellcode, weshalb ich die lösung in dem forum nicht einfach übertragen kann.. =(


    Fehler in Konsole:
    Code:
    log4j:ERROR Error occured while sending e-mail notification.
    javax.mail.MessagingException: Unknown SMTP host: smtp.web.de;
      nested exception is:
    	java.net.UnknownHostException: smtp.web.de
    	at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1543)
    	at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:453)
    	at javax.mail.Service.connect(Service.java:313)
    	at javax.mail.Service.connect(Service.java:172)
    	at javax.mail.Service.connect(Service.java:121)
    	at javax.mail.Transport.send0(Transport.java:190)
    	at javax.mail.Transport.send(Transport.java:120)
    	at org.apache.log4j.net.SMTPAppender.sendBuffer(SMTPAppender.java:330)
    	at org.apache.log4j.net.SMTPAppender.append(SMTPAppender.java:215)
    	at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)
    	at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)
    	at org.apache.log4j.Category.callAppenders(Category.java:206)
    	at org.apache.log4j.Category.forcedLog(Category.java:391)
    	at org.apache.log4j.Category.error(Category.java:305)
    	at TestCases.statuscodePrüfen(TestCases.java:143)
    	at Basisklasse.prüfungDurchführen(Basisklasse.java:126)
    	at Basisklasse$1.run(Basisklasse.java:69)
    Caused by: java.net.UnknownHostException: smtp.web.de
    	at java.net.PlainSocketImpl.connect(Unknown Source)
    	at java.net.SocksSocketImpl.connect(Unknown Source)
    	at java.net.Socket.connect(Unknown Source)
    	at java.net.Socket.connect(Unknown Source)
    	at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:267)
    	at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:227)
    	at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1511)
    	... 16 more
     
  8. daboom

    daboom Megabyte

    Du kannst doch auch per setter (setLevel() glaub ich) am Logger direkt das logging level setzen, oder?

    Ich weiß aber nicht, wie sich das so verhält, wenn man das zur Laufzeit macht.

    Warum nutzt Du nochmal keine property Files?
     
  9. Miriam1990

    Miriam1990 Byte

    Keine property-Files, weil ich den SMTP-Appender damit nich hinbekommen hab und ich alles einheitlich machen wollte..
    Klar kann man das über Code einstellen. Hab ich auch schon mehrmals drin, einmal

    Code:
    Logger logger = Logger.getLogger("FileLogger"); 
    logger.setLevel( Level.INFO );
    für meinen FileLogger selbst und dann hab ich noch ein

    Code:
    Logger.getRootLogger().setLevel(Level.OFF);
    Weil Log4j mir plötzlich noch Millionen Debug Meldungen geschickt hatte. Aber ein Freund von mir hat gemeint, es liegt eher nich am Level. Stimmt ja eigentlich auch, weil dann hätte es ja durch diese 2. Zeile auch weg sein müssen.

    Es is halt irgendwie zu Haareraufen. Ich kann über Textausgaben genau erkennen, in welcher Zeile die Meldung geworfen wird, aber mein

    Code:
    try {
       Befehl;
    }catch (Throwable e) {}
    bleibt völlig wirkungslos - sprich, die Meldung kommt immernoch raus.
    Naja vielen Dank für deine Antwort. Habs aber jetzt so ziemlich aufgegeben. Ist ja auch eigentlich nur ein Kunstfehler. Die Meldung, die da rauskommt, is eigentlich trotzdem recht verständlich und in meiner Dokumentation steht dann halt nochmal ein Hinweis darauf, dass diese Meldung darauf hindeutet, dass keine Internetverbindung besteht.

    Viele Grüße,
    Miriam
     
Thread Status:
Not open for further replies.

Share This Page