EmailOutputter

This is an experimental class that sends a number of formatted log events as an RFC 822 email. It should work fine if Net:SMTP doesn’t cause any problems. Just in case, create a logger named ‘log4r’ and give it an outputter to see the logging statements made by this class. If it fails to send email, it will set itself to OFF and stop logging.

In order to use it,

  require 'log4r/outputter/emailoutputter'

SMTP Configuration

All arguments to Net::SMTP.start are supported. Pass them as hash parameters to new. The to field is specified as a comma-delimited list of emails (padded with s* if desired).

An example:

  email_out = EmailOutputter.new 'email_out',
                     :server=>'localhost',
                     :port=>25,
                     :domain=>'somewhere.com',
                     :from=>'me@foo.bar',
                     :to=>'them@foo.bar, me@foo.bar, bozo@clown.net',
                     :subject=>'Log Report'

LogEvent Buffer

EmailOutputter stores log messages in a buffer. When the buffer reaches a certain number, the buffsize, it will send an email containing the contents of the buffer. The default buffsize is 100. To set buffsize,

  email_out.buffsize = 1000   # set the buffsize to 1000

Flush To Send Email

Flushing an EmailOutputter will mail out all the remaining LogEvents. This is convenient for systems that encapsulate the shutdown process. It’s a good idea to do this for all outputters,

  Outputter.each_outputter {|o| o.flush}

Alternatively, one can invoke flush on the outputter directly,

  email_out.flush

It’s also a good idea to notify the recepient of the email that the system is shutting down. Before flushing, log a message to the owner of this outputter,

  log_with_email_out.info "The system is shutting down at #{Time.now}"

Format When?

LogEvents may either be formatted as they come in or as the email is being composed. To do the former, specify a value of true to the hash parameter formatfirst. The default is to format during email composition.

  email_out.formatfirst = true     # format as soon as LogEvents are received

Immediate Notification

EmailOutputter can be configured to flush and send the email whenever the logger sees a certain log priority. Use the immediate_at hash parameter and specify the levels as a comma-delimited list (like an XML element). To trigger an email on FATAL and ERROR,

  email_out.immediate_at = "FATAL, ERROR"

Example

A security logger sends email to several folks, buffering up to 25 log events and sending immediates on CRIT and WARN

  EmailOutputter.new 'security',
                     :to => 'bob@secure.net, frank@secure.net',
                     :buffsize => 25,
                     :immediate_at => 'WARN, CRIT'

XML Configuration

See log4r/configurator.rb for details. Here’s an example:

  <outputter name="security" type="EmailOutputter"
             buffsize="25" level="ALL">
    <immediate_at>WARN, CRIT</immediate_at>
    <server>localhost</server>
    <from>me@secure.net</from>
    <to>
      bob@secure.net, frank@secure.net
    </to>
    ...
  </outputter>

To Do

This class could use some sophistication, in particular a means to compress the logs, a way to set the subject dynamically (probably via a block method), and a time trigger. When the time trigger is introduced, a buffsize of 0 should mean ignore buffsize to determine when to send the email.

[Validate]

Generated with the Darkfish Rdoc Generator 1.1.6.