Log Dosyalarında Error Bulursa Mail Atan Python Script’i

By | 26 May 2016

Başka bir servisimiz verdiğimiz dizin altında o günün tarihi adında dizin oluşturuyor. Bu dizin var mı kontrol ediyoruz, eğer varsa bu dizin altındaki log dosyalarında ‘ERROR‘ var mı bunu kontrol ettireceğiz. Bunu Python 2.6/2.7 ile yapacağım.  Dizinimiz ‘/var/log/custom/’ olsun ve bunun altında ‘/var/log/custom/26_05_2016/’ dizinini kontrol edelim. Siz kendi senaryonuza göre düzenleyebilirsiniz. Bu scripti crond servisi ile de kullanabilir, hataları bir dosyaya yazıp, ordan okuyarak mail içeriğini oradan dolduracağım.

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import subprocess
import time
import os
import sys
#yukarda gerekli olan kütüphane/paketleri import ediyoruz, eğer yoksa pip ile kurabilirsiniz.

#terminal komutu olan grep ile -a bazen binary cümleler olabilir onları text'e çeviriyor, -r parametresini ekleyerek custom altındaki tüm dosyalarda ERROR kelimesini aratıyoruz.
p = subprocess.Popen(['grep', '-r', '-a', 'ERROR', '/var/log/custom/'], stdout=subprocess.PIPE)
#eğer ERROR bulursa ekrana çıktı veriyor, çıktıyı alıp output.log dosyasına yazıyorum.
with open('output.log', 'w') as file:
    for line in p.stdout:
        file.write(line)

validDate = time.strftime("%d_%m_%Y")

#maili buradan gönderiyoruz. parametre olarak mail konusu alıyor.
def sendMail(subject):
    #mail ve parolasını giriyoruz. me olan yere gönderilecek mail
    sender = 'mertsmsk0@gmail.com'
    sender_pass = '*******'
    me = 'example@example.com'

    message = MIMEMultipart('alternative')
    message['Subject'] = subject
    message['From'] = sender
    message['To'] = me
    html = ''

    #dosya açılıyor ve içinde hatalar mail içeriğine ekleniyor.
    with open('output.log', 'r') as file:
        for line in f.readlines():
            html += '<ul><li>' + str(line) + '</li></ul>'

    #eğer server cloud'ta ise port ayarlamasını ona göre yapmak gerekiyor.
    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.ehlo()
    server.starttls()
    server.ehlo()
    part = MIMEText(html, 'html')
    message.attach(part)

    #mail server'a bağlanıyor, maili atıyor ve çıkış yapıyor.
    server.login(sender, sender_pass)
    server.sendmail(sender, me, message.as_string())
    server.quit()

#eğer çıktı dosyamızda result varsa Loglarda hata bulundu konulu mail atıyor.
with open('output.log') as f:
    for line in f.readlines():
        if 'ERROR' in line:
            sendMail('Loglarda hata bulundu!')

#eğer verdiğimiz dizin bulunamazsa mail atıyor ve scripti sonlandırıyor.
if not os.path.exists('/var/log/custom/' + validDate):
    sendMail(validDate + ' tarihine ait log dizini bulunamadi.')
    sys.exit()

Kodları yorum satırlarıyla açıklamaya çalıştım. Yaptığı işlem çok basit aslında. Hata bulursa veya verdiğimiz dizini bulamazsa mail atıyor. Scripti çalıştırdığımda alttaki gibi çıktı görebilirsiniz. Dizin isimleri kişisel bilgisayarımda çalıştırdığım için değişti.

Screen Shot 2016-05-26 at 1.55.30 PM Screen Shot 2016-05-26 at 1.55.36 PM

Dediğim gibi bu scripti alıp, kendi senaryonuza göre uyarlayabilirsiniz. Anlatacaklarım şimdilik bu kadar, bir dahaki yazımda görüşmez üzere… 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *

*