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: 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