Avatar billede backupmand Nybegynder
09. maj 2008 - 11:18 Der er 17 kommentarer og
1 løsning

log4j metode

Hej,

Har konfigureret en log4j.xml til at benytte min egen skræddersyede SMTPAppender klasse, log niveau er på error.

Spørgsmålet er hvilken metode kaldes i SMTPAppender når der skal sendes en mail ud, er det sendBuffer()? Eller en anden ?

Tak for svar
Avatar billede arne_v Ekspert
09. maj 2008 - 15:44 #1
Altsaa du laver ikke din egen klasse som implementerer Appender (og hvor det er doAppend
metoden der "goer" noget), men du vil extende SMTPAppender klassen ?

Som jeg laeser docs, saa er det sendBuffer's opgave at sende alt det der er i den
cykliske buffer.

Saa svaret maa vaere: JA.
Avatar billede backupmand Nybegynder
09. maj 2008 - 15:50 #2
Har sat en meget liller buffersize i log4j.xml og sat Sysout's i sendBuffer() metoden, men den bliver aldrig kaldt. Gad vide hvad årsagen kan være dertil?
Avatar billede arne_v Ekspert
09. maj 2008 - 17:36 #3
Det virker hos mig.
Avatar billede arne_v Ekspert
09. maj 2008 - 17:37 #4
log4j.category.test = debug, logsmtp
log4j.appender.logsmtp = may.CustomSMTPAppender
log4j.appender.logsmtp.threshold = debug
log4j.appender.logsmtp.from = arne@arne
log4j.appender.logsmtp.to = arne@arne
log4j.appender.logsmtp.subject = Log4j info
log4j.appender.logsmtp.SMTPHost = arne
log4j.appender.logsmtp.layout = org.apache.log4j.PatternLayout
log4j.appender.logsmtp.layout.ConversionPattern = %d %C %M %p: %m%n
Avatar billede arne_v Ekspert
09. maj 2008 - 17:38 #5
package may;

import org.apache.log4j.net.SMTPAppender;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.spi.TriggeringEventEvaluator;

public class CustomSMTPAppender extends SMTPAppender  {
    public CustomSMTPAppender() {
        super(new AcceptAll());
    }
    public void sendBuffer() {
        System.out.println("Send buffer called - buffer:");
        for(int i = 0; i < cb.length(); i++) {
            System.out.println(cb.get(i).getRenderedMessage());
        }
    }
}

class AcceptAll implements TriggeringEventEvaluator {
    public boolean isTriggeringEvent(LoggingEvent arg0) {
        return true;
    }
}
Avatar billede arne_v Ekspert
09. maj 2008 - 17:43 #6
package may;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class TestCustomSMTPAppender {
    public static void main(String[] args) {
        PropertyConfigurator.configure("C:\\log4j.properties");
        Logger log = Logger.getLogger("test");
        for(int i = 0; i < 100; i++) {
            log.info("Ooops #" + i);
        }
    }
}
Avatar billede backupmand Nybegynder
11. maj 2008 - 14:09 #7
Jeg har min egen appender i log4j.xml. som jeg benytter i min egen logger.Jeg forsøger at logge til appenderen til det nieveau jeg har sat. Jeg har egentlig bare kopieret dit forsøg her opppe fra, forskellen er bare at jeg benytter en xml fil og ikke en properties fil. Jeg får bare ingen mail - selve mail setup har jeg testet, den sender mails når jeg kalder sendbuffer direkte. Kan det være fordi min cykliske buffer størrelse er for stor ? Jeg kan se at activateOPtions bliver kaldt, ligeledes bliver doAppend kaldet.
Avatar billede backupmand Nybegynder
11. maj 2008 - 14:22 #8
Eller også er problemet at bufferen er tom, jeg kan se at der ikke appendes når jeg implementerer min egen logger. Til gengæld appendes der når jeg tilføjer loggeren til <root>. Selvom jeg gør det, så kaldes sendBuffer stadig ikke. Jeg tror ikke jeg skal sætte append til at sende ud, det er ikke meningen.
Avatar billede arne_v Ekspert
11. maj 2008 - 23:44 #9
Har du en TriggeringEventEvaluator ?
Avatar billede arne_v Ekspert
11. maj 2008 - 23:45 #10
Men ellers bliver du jo nok nødt til at finde ud af præcis hvad der sker. Kommer der ikke
noget i cb ? Eller bliver cb ikke sendt ?
Avatar billede backupmand Nybegynder
12. maj 2008 - 20:45 #11
Jeg har sat dit eksempel op i Tomcat og det virker fint nok og sendBuffer bliver kaldet.
Avatar billede arne_v Ekspert
12. maj 2008 - 20:55 #12
Har du en TriggeringEventEvaluator ?
Avatar billede backupmand Nybegynder
12. maj 2008 - 22:04 #13
Ja jeg har. Jeg forstår ikke hvorfor min <logger> ikke vil træde i kraft. Som jeg forstår det kan man override det der står i <root> ved at definere et <logger> tag.

Min log4j kode er en bid i en "stor" sammenhæng, dvs der er noget kode der findes i projektet, som jeg ikke har lavet. Det er muligt der er en konfiguration et sted, jeg ikke kender til, hvorfor jeg ikke med sikkerhed kan sige hvorfor det ikke virker.

Min appender bruger min egen klasse, der overrider SMTPappender og jeg foretager
egne implementeringer af sendBuffer og activateOptions. sendBuffer kaldes aldrig, heller ikke når jeg tilføjer min appender til Root. Jeg ved ikke hvorfor. Nu har jeg købt et dokument der omhandler log4j. Hvis det ikke kan hjælpe mig til at løse problemet .. ja så ved jeg ikke hvad.
Avatar billede backupmand Nybegynder
12. maj 2008 - 22:06 #14
Fejlen er fra tid til anden log4j:ERROR Message object not configured. det skulle betyde at den ikke kan se konfigurationsfilen på path'en. Hvis den ikke kan det, ja så kan det måske forklare lidt allerede.
Avatar billede arne_v Ekspert
13. maj 2008 - 03:07 #15
hvordan ser din XML config us ?
Avatar billede backupmand Nybegynder
13. maj 2008 - 09:02 #16
Noget i retning af

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/docs/api/org/apache/log4j/xml/log4j.dtd">
<log4j:configuration>

  <appender name="RollingAppender" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="File" value="output.log"/>
    <param name="DatePattern" value="'.'yyyy-MM-dd"/>
    <param name="Threshold" value="ERROR"/>
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{2}(%M:%L) - %m%n"/>
    </layout>
  </appender> 
 
  <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
    <param name="Threshold" value="DEBUG"/>
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{2}(%M:%L) - %m%n"/>
    </layout>
  </appender>
 
  <appender name="EmailAppender" class="klassesomarverfrasmtpappender">
    <param name="EvaluatorClass" value="MinEvaluator"/>
    <param name="Threshold" value="ERROR"/>   
    <param name="SMTPHost" value="smtp.gmail.com"/>
    <param name="To" value="min@mail.com"/>
    <param name="From" value="fra@mail.com"/>
    <param name="BufferSize" value="1" />   
    <param name="LocationInfo" value="true"/>   
    <param name="Subject" value="[SMTPAppender] Application message" />
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d %-5p %c(%M:%L) - %m%n"/>
    </layout>
  </appender> 
 
  <logger name="org.apache.axis">
    <level value="OFF"/>
  </logger>
 
  <logger name="dk">
    <level value="info"/>   
    <appender-ref ref="RollingAppender"/> 
  </logger>
 
  <root>
    <level value="info"/>
    <appender-ref ref="ConsoleAppender"/>
    <appender-ref ref="EmailAppender"/>               
  </root>
 
</log4j:configuration>
Avatar billede backupmand Nybegynder
13. maj 2008 - 15:51 #17
Det virker.

I stedet for at kigge på en masse konfiguration, har jeg lært at det jeg skal kigge på er den måde det implementeres på. Jeg kiggede på din kode og kunne se at du IKKE overskrev activateOptions. Da jeg uden grund bare havde gjort det, jamen så ødelagde jeg Message konfigurationen. Så der skrives åbenbart noget i activateOptions i SMTPAppender.

Da jeg fjernede activateOptions i min klasse (og lod superklassen gøre sit arbejde) så virkede det.
Avatar billede backupmand Nybegynder
27. maj 2008 - 08:58 #18
Da jeg fjernede activateOptions i min klasse (og lod superklassen gøre sit arbejde) så virkede det.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester