FileDocCategorySizeDatePackage
SMTPAppender.javaAPI DocApache log4j 1.2.1516417Sat Aug 25 00:09:40 BST 2007org.apache.log4j.net

SMTPAppender

public class SMTPAppender extends AppenderSkeleton implements UnrecognizedElementHandler
Send an e-mail when a specific logging event occurs, typically on errors or fatal errors.

The number of logging events delivered in this e-mail depend on the value of BufferSize option. The SMTPAppender keeps only the last BufferSize logging events in its cyclic buffer. This keeps memory requirements at a reasonable level while still delivering useful application context. By default, an email message will be sent when an ERROR or higher severity message is appended. The triggering criteria can be modified by setting the evaluatorClass property with the name of a class implementing TriggeringEventEvaluator, setting the evaluator property with an instance of TriggeringEventEvaluator or nesting a triggeringPolicy element where the specified class implements TriggeringEventEvaluator.

author
Ceki Gülcü
since
1.0

Fields Summary
private String
to
private String
cc
Comma separated list of cc recipients.
private String
bcc
Comma separated list of bcc recipients.
private String
from
private String
subject
private String
smtpHost
private String
smtpUsername
private String
smtpPassword
private boolean
smtpDebug
private int
bufferSize
private boolean
locationInfo
protected CyclicBuffer
cb
protected Message
msg
protected TriggeringEventEvaluator
evaluator
Constructors Summary
public SMTPAppender()
The default constructor will instantiate the appender with a {@link TriggeringEventEvaluator} that will trigger on events with level ERROR or higher.




                                   
  
   
    this(new DefaultEvaluator());
  
public SMTPAppender(TriggeringEventEvaluator evaluator)
Use evaluator passed as parameter as the {@link TriggeringEventEvaluator} for this SMTPAppender.

    this.evaluator = evaluator;
  
Methods Summary
public voidactivateOptions()
Activate the specified options, such as the smtp host, the recipient, from, etc.

    Session session = createSession();
    msg = new MimeMessage(session);

     try {
        addressMessage(msg);
        if(subject != null) {
	       msg.setSubject(subject);
	    }
     } catch(MessagingException e) {
       LogLog.error("Could not activate SMTPAppender options.", e );
     }

     if (evaluator instanceof OptionHandler) {
         ((OptionHandler) evaluator).activateOptions();
     }
  
protected voidaddressMessage(javax.mail.Message msg)
Address message.

param
msg message, may not be null.
throws
MessagingException thrown if error addressing message.

       if (from != null) {
	 		msg.setFrom(getAddress(from));
       } else {
	 		msg.setFrom();
	   }

       if (to != null && to.length() > 0) {
             msg.setRecipients(Message.RecipientType.TO, parseAddress(to));
       }

      //Add CC receipients if defined.
	  if (cc != null && cc.length() > 0) {
		msg.setRecipients(Message.RecipientType.CC, parseAddress(cc));
	  }

      //Add BCC receipients if defined.
	  if (bcc != null && bcc.length() > 0) {
		msg.setRecipients(Message.RecipientType.BCC, parseAddress(bcc));
	  }
  
public voidappend(org.apache.log4j.spi.LoggingEvent event)
Perform SMTPAppender specific appending actions, mainly adding the event to a cyclic buffer and checking if the event triggers an e-mail to be sent.


    if(!checkEntryConditions()) {
      return;
    }

    event.getThreadName();
    event.getNDC();
    event.getMDCCopy();
    if(locationInfo) {
      event.getLocationInformation();
    }
    cb.add(event);
    if(evaluator.isTriggeringEvent(event)) {
      sendBuffer();
    }
  
protected booleancheckEntryConditions()
This method determines if there is a sense in attempting to append.

It checks whether there is a set output target and also if there is a set layout. If these checks fail, then the boolean value false is returned.

    if(this.msg == null) {
      errorHandler.error("Message object not configured.");
      return false;
    }

    if(this.evaluator == null) {
      errorHandler.error("No TriggeringEventEvaluator is set for appender ["+
			 name+"].");
      return false;
    }


    if(this.layout == null) {
      errorHandler.error("No layout set for appender named ["+name+"].");
      return false;
    }
    return true;
  
public synchronized voidclose()

    this.closed = true;
  
protected javax.mail.SessioncreateSession()
Create mail session.

return
mail session, may not be null.

    Properties props = null;
    try {
        props = new Properties (System.getProperties());
    } catch(SecurityException ex) {
        props = new Properties();
    }
    if (smtpHost != null) {
      props.put("mail.smtp.host", smtpHost);
    }
    
    Authenticator auth = null;
    if(smtpPassword != null && smtpUsername != null) {
      props.put("mail.smtp.auth", "true");
      auth = new Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
          return new PasswordAuthentication(smtpUsername, smtpPassword);
        }
      };
    }
    Session session = Session.getInstance(props, auth);
    if (smtpDebug) {
        session.setDebug(smtpDebug);
    }
    return session;
  
javax.mail.internet.InternetAddressgetAddress(java.lang.String addressStr)

    try {
      return new InternetAddress(addressStr);
    } catch(AddressException e) {
      errorHandler.error("Could not parse address ["+addressStr+"].", e,
			 ErrorCode.ADDRESS_PARSE_FAILURE);
      return null;
    }
  
public java.lang.StringgetBcc()
Get the bcc recipient addresses.

return
recipient addresses as comma separated string, may be null.

     return bcc;
    
public intgetBufferSize()
Returns value of the BufferSize option.

    return bufferSize;
  
public java.lang.StringgetCc()
Get the cc recipient addresses.

return
recipient addresses as comma separated string, may be null.

     return cc;
    
public final org.apache.log4j.spi.TriggeringEventEvaluatorgetEvaluator()
Get triggering evaluator.

return
triggering event evaluator.
since
1.2.15

      return evaluator;
  
public java.lang.StringgetEvaluatorClass()
Returns value of the EvaluatorClass option.

    return evaluator == null ? null : evaluator.getClass().getName();
  
public java.lang.StringgetFrom()
Returns value of the From option.

    return from;
  
public booleangetLocationInfo()
Returns value of the LocationInfo option.

    return locationInfo;
  
public booleangetSMTPDebug()
Get SMTP debug.

return
SMTP debug flag.

    return smtpDebug;
  
public java.lang.StringgetSMTPHost()
Returns value of the SMTPHost option.

    return smtpHost;
  
public java.lang.StringgetSMTPPassword()
Get SMTP password.

return
SMTP password, may be null.

    return smtpPassword;
  
public java.lang.StringgetSMTPUsername()
Get SMTP user name.

return
SMTP user name, may be null.

    return smtpUsername;
  
public java.lang.StringgetSubject()
Returns value of the Subject option.

    return subject;
  
public java.lang.StringgetTo()
Returns value of the To option.

    return to;
  
javax.mail.internet.InternetAddress[]parseAddress(java.lang.String addressStr)

    try {
      return InternetAddress.parse(addressStr, true);
    } catch(AddressException e) {
      errorHandler.error("Could not parse address ["+addressStr+"].", e,
			 ErrorCode.ADDRESS_PARSE_FAILURE);
      return null;
    }
  
public booleanparseUnrecognizedElement(org.w3c.dom.Element element, java.util.Properties props)
{@inheritDoc}

      if ("triggeringPolicy".equals(element.getNodeName())) {
          Object triggerPolicy =
                  org.apache.log4j.xml.DOMConfigurator.parseElement(
                          element, props, TriggeringEventEvaluator.class);
          if (triggerPolicy instanceof TriggeringEventEvaluator) {
              setEvaluator((TriggeringEventEvaluator) triggerPolicy);
          }
          return true;
      }

      return false;
  
public booleanrequiresLayout()
The SMTPAppender requires a {@link org.apache.log4j.Layout layout}.

    return true;
  
protected voidsendBuffer()
Send the contents of the cyclic buffer as an e-mail message.


    // Note: this code already owns the monitor for this
    // appender. This frees us from needing to synchronize on 'cb'.
    try {
      MimeBodyPart part = new MimeBodyPart();

      StringBuffer sbuf = new StringBuffer();
      String t = layout.getHeader();
      if(t != null)
	sbuf.append(t);
      int len =  cb.length();
      for(int i = 0; i < len; i++) {
	//sbuf.append(MimeUtility.encodeText(layout.format(cb.get())));
	LoggingEvent event = cb.get();
	sbuf.append(layout.format(event));
	if(layout.ignoresThrowable()) {
	  String[] s = event.getThrowableStrRep();
	  if (s != null) {
	    for(int j = 0; j < s.length; j++) {
	      sbuf.append(s[j]);
	      sbuf.append(Layout.LINE_SEP);
	    }
	  }
	}
      }
      t = layout.getFooter();
      if(t != null)
	sbuf.append(t);
      part.setContent(sbuf.toString(), layout.getContentType());

      Multipart mp = new MimeMultipart();
      mp.addBodyPart(part);
      msg.setContent(mp);

      msg.setSentDate(new Date());
      Transport.send(msg);
    } catch(Exception e) {
      LogLog.error("Error occured while sending e-mail notification.", e);
    }
  
public voidsetBcc(java.lang.String addresses)
Set the bcc recipient addresses.

param
addresses recipient addresses as comma separated string, may be null.

     this.bcc = addresses;
   
public voidsetBufferSize(int bufferSize)
The BufferSize option takes a positive integer representing the maximum number of logging events to collect in a cyclic buffer. When the BufferSize is reached, oldest events are deleted as new events are added to the buffer. By default the size of the cyclic buffer is 512 events.

    this.bufferSize = bufferSize;
    cb.resize(bufferSize);
  
public voidsetCc(java.lang.String addresses)
Set the cc recipient addresses.

param
addresses recipient addresses as comma separated string, may be null.

     this.cc = addresses;
   
public final voidsetEvaluator(org.apache.log4j.spi.TriggeringEventEvaluator trigger)
Sets triggering evaluator.

param
trigger triggering event evaluator.
since
1.2.15

      if (trigger == null) {
          throw new NullPointerException("trigger");
      }
      this.evaluator = trigger;
  
public voidsetEvaluatorClass(java.lang.String value)
The EvaluatorClass option takes a string value representing the name of the class implementing the {@link TriggeringEventEvaluator} interface. A corresponding object will be instantiated and assigned as the triggering event evaluator for the SMTPAppender.

      evaluator = (TriggeringEventEvaluator)
                OptionConverter.instantiateByClassName(value,
					   TriggeringEventEvaluator.class,
						       evaluator);
  
public voidsetFrom(java.lang.String from)
The From option takes a string value which should be a e-mail address of the sender.

    this.from = from;
  
public voidsetLocationInfo(boolean locationInfo)
The LocationInfo option takes a boolean value. By default, it is set to false which means there will be no effort to extract the location information related to the event. As a result, the layout that formats the events as they are sent out in an e-mail is likely to place the wrong location information (if present in the format).

Location information extraction is comparatively very slow and should be avoided unless performance is not a concern.

    this.locationInfo = locationInfo;
  
public voidsetSMTPDebug(boolean debug)
Setting the SmtpDebug option to true will cause the mail session to log its server interaction to stdout. This can be useful when debuging the appender but should not be used during production because username and password information is included in the output.

param
debug debug flag.

    this.smtpDebug = debug;
  
public voidsetSMTPHost(java.lang.String smtpHost)
The SMTPHost option takes a string value which should be a the host name of the SMTP server that will send the e-mail message.

    this.smtpHost = smtpHost;
  
public voidsetSMTPPassword(java.lang.String password)
The SmtpPassword option takes a string value which should be the password required to authenticate against the mail server.

param
password password, may be null.

    this.smtpPassword = password;
  
public voidsetSMTPUsername(java.lang.String username)
The SmtpUsername option takes a string value which should be the username required to authenticate against the mail server.

param
username user name, may be null.

    this.smtpUsername = username;
  
public voidsetSubject(java.lang.String subject)
The Subject option takes a string value which should be a the subject of the e-mail message.

    this.subject = subject;
  
public voidsetTo(java.lang.String to)
The To option takes a string value which should be a comma separated list of e-mail address of the recipients.

    this.to = to;