Harbor::LogAppenders::Email
Parent
Logging::Appender
Methods
Attributes
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: unless @level > event.level 22: flush_expired_subjects 23: 24: data = event.data 25: subject = data.split($/, 2)[0] 26: 27: if tracked_subject = @tracked_subjects.detect { |tracked_subject| tracked_subject.subject == subject } 28: tracked_subject.occurances << Time.now 29: 30: # Don't send the email if we've already sent one within the time threshold 31: return false if (Time.now - tracked_subject.sent_at) < @duplicate_subject_delivery_threshold 32: else 33: tracked_subject = TrackedSubject.new(subject) 34: tracked_subject.occurances << Time.now 35: 36: @tracked_subjects << tracked_subject 37: end 38: 39: mailer = @container.get(:mailer) 40: mailer.from = @from 41: mailer.to = @addresses 42: 43: data << "\n(from: #{`hostname`.chomp}, PID: #{Process.pid})" 44: 45: mailer.subject = "[ERROR] #{subject}" 46: mailer["x_priority"] = "1 (Highest)" 47: mailer["x_msmail_priority"] = "High" 48: mailer.text = if tracked_subject.occurances.size > 1 49: "Repeated #{tracked_subject.occurances.size} times since #{tracked_subject.sent_at.strftime('%Y-%m-%d %R%z')}\n\n#{data}" 50: else 51: data 52: end 53: mailer.send! 54: 55: tracked_subject.occurances.clear 56: tracked_subject.sent_at = Time.now 57: end 58: 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 65 65: def flush_expired_subjects 66: @tracked_subjects.reject! do |tracked_subject| 67: tracked_subject.occurances.empty? && (Time.now - tracked_subject.sent_at) >= @duplicate_subject_delivery_threshold 68: end 69: end