Harbor Documentation

Harbor::LogAppenders::Email

Attributes

  • duplicate_subject_delivery_threshold [RW] (Not documented)

Public Class Methods

new(container, from, *addresses)

      # File lib/harbor/logging/appenders/email.rb, line 8
 8:       def initialize(container, from, *addresses)
 9:         @container = container
10:         @from = from
11:         @addresses = addresses
12:         @tracked_subjects = []
13: 
14:         # Deliver emails with exact-match subjects only every 10 Minutes
15:         @duplicate_subject_delivery_threshold = 60 * 10
16: 
17:         super("exception_notifier", :level => :error)
18:       end

Public Instance Methods

write(event)

      # File lib/harbor/logging/appenders/email.rb, line 20
20:       def write(event)
21:         return unless event.level >= @level
22: 
23:         flush_expired_subjects
24: 
25:         data = event.data
26:         subject = data.split($/, 2)[0]
27: 
28:         if tracked_subject = @tracked_subjects.detect { |tracked_subject| tracked_subject.subject == subject }
29:           tracked_subject.occurances << Time.now
30: 
31:           # Don't send the email if we've already sent one within the time threshold
32:           return false if (Time.now - tracked_subject.sent_at) < @duplicate_subject_delivery_threshold
33:         else
34:           tracked_subject = TrackedSubject.new(subject)
35:           tracked_subject.occurances << Time.now
36: 
37:           @tracked_subjects << tracked_subject
38:         end
39: 
40:         mailer = @container.get(:mailer)
41:         mailer.from = @from
42:         mailer.to = @addresses
43:         host = `hostname`.chomp
44: 
45:         data << "\n(from: #{host}, PID: #{Process.pid})"
46: 
47:         mailer.subject = "[ERROR] [#{host}] #{subject}"
48:         mailer["x_priority"] = "1 (Highest)"
49:         mailer["x_msmail_priority"] = "High"
50:         mailer.text = if tracked_subject.occurances.size > 1
51:           "Repeated #{tracked_subject.occurances.size} times since #{tracked_subject.sent_at.strftime('%Y-%m-%d %R%z')}\n\n#{data}"
52:         else
53:           data
54:         end
55:         mailer.send!
56: 
57:         tracked_subject.occurances.clear
58:         tracked_subject.sent_at = Time.now
59:       end

Private Instance Methods

flush_expired_subjects()

Flushes items from the @tracked_subjects array when they are no longer useful

      # File lib/harbor/logging/appenders/email.rb, line 66
66:       def flush_expired_subjects
67:         @tracked_subjects.reject! do |tracked_subject|
68:           tracked_subject.occurances.empty? && (Time.now - tracked_subject.sent_at) >= @duplicate_subject_delivery_threshold
69:         end
70:       end