python模块,邮件推送交换机error级别以上log,django前端展示
阅读原文时间:2023年07月09日阅读:3

前情概要

  原syslog服务器只收集不推送日志,可以实时展示,服务器在海外内网,办公网做的有分流,到日志服务器的流量送到香港,其余流量国内,疫情期间在家办公,每次连接需要拨海外l2tp,挂着梯子访问国内时延较大影响办公,所以日志服务器基本一天登录一次,然后就错过了重要的error信息-_-!,所以在家的几天做了两个方案,1是上篇博客中的数通技术,2就是做一个功能邮箱推送error级别以上的日志

功能

  django前端用以日志的展示和搜索,后端用于日志采集与邮件推送

目录结构

-swlog

---swlog

------  setting.py

------  url.py

---log

------  models.py

------  views.py

------  limit.py

---sock

------  bin.py

------  formstr.py

------  sendmail.py

------  sql.py

---templates

------  log.html

------  login.html

urls

1 from django.contrib import admin
2 from django.urls import path
3 from log import views
4 import threading
5 from log.sock.bin import logserver
6 urlpatterns = [
7 path('admin/', admin.site.urls),
8 path('login.html/', views.login),
9 path('log.html/', views.log),
10 ]
11 t1 = threading.Thread(target=logserver)
12 t1.start()

urls.py

后端分页

1 class limit:
2 def limit(self,res,obj):
3 limit = int(res.GET.get('limit',1))
4 pagelimit = int(res.GET.get('pagelimit',50))
5 startlimit = (limit-1)*pagelimit
6 endlimit = limit*pagelimit
7 logdb = obj[startlimit:endlimit]
8 page_count,lastpage_count = divmod(obj.count(),pagelimit)
9 if lastpage_count:
10 page_count +=1
11 startpage = 1
12 endpage = page_count
13 hrefli=[]
14 hrefli.append('

每页显示
'%res.path)
15 if limit !=1:
16 hrefli.append('%s'%(res.path,limit-1,'上一页'))
17 for x in range(startpage,endpage+1):
18 if limit+3 < x or x <limit -3:
19 hrefli.append(''%(res.path,x,x))
20 elif x == limit:
21 hrefli.append('%s'%(res.path,x,x))
22 else:
23 hrefli.append('%s'%(res.path,x,x))
24 if limit != endpage:
25 hrefli.append('%s'%(res.path,limit+1,'下一页'))
26 href=''.join(hrefli)
27 return href,logdb

limit.py

view后端进行登录验证,拉取日志

1 from django.shortcuts import render,redirect,HttpResponse
2 from log import models
3 from log.limit import limit
4 from django.views.decorators.csrf import csrf_exempt
5 from functools import wraps
6 from django.utils.safestring import mark_safe
7 def auth(func):
8 @wraps(func)
9 def check_login(res,*args,**kwargs):
10 try:
11 res.session['name']
12 return func(res,*args,**kwargs)
13 except:
14 return render(res,'login.html')
15
16 return check_login
17
18
19 @csrf_exempt
20 def login(res):
21 if res.method == 'GET':
22 return render(res,'login.html')
23 elif res.method == 'POST':
24 username = res.POST.get('username')
25 passwd = res.POST.get('passwd')
26 if models.login.objects.filter(username=username,passwd=passwd):
27 res.session.set_expiry(3600)
28 res.session['name']=username
29
30 return redirect('/log.html')
31 else:
32 error = '用户名或密码错误'
33 return render(res,'login.html',{'error':error})
34
35 @auth
36 @csrf_exempt
37 def log(res):
38 obj = models.log.objects
39 if res.method =='GET':
40 pagelimit = limit()
41 html_lable,logdb = pagelimit.limit(res,obj.all())
42 return render(res,'log.html',{'logdb':logdb,'limit':mark_safe(html_lable)})
43 elif res.method == 'POST':
44 if res.POST.get('search'):
45 from django.db.models import Q
46 data = res.POST.get('search')
47 logdb = obj.filter(Q(time__contains=data)| Q(host__contains=data)| Q(level__contains=data)| Q(message__contains=data))[0:500]
48 return render(res,'log.html',{'logdb':logdb})
49 elif res.POST.get('day'):
50 import time
51 day = int(res.POST.get('day'))-1
52 h_time = time.strftime('%Y-%m-%d',time.localtime(time.time()-86400*day))
53 delete_count = obj.filter(time__lt=h_time).count()
54 obj.filter(time__lt=h_time).delete()
55 return redirect('/log.html')
56 return redirect('/log.html')
57
58

views.py

templates前端简单做两个页面,一个用于登录,另一个用于展示和搜索

1
2 3 4 5 6 7 登录 8 11 12 13 14

15 16 17
18

日志管理系统

19 20
21 22
23 24 {{error}} 25
26
27 28 29

login.html

1
2 3 4 5 6 7 8 Document 9 24 25 26 27

28

日志管理系统

29 35 36 {{limit}} 37
38 清除 39 45 天历史数据 46 47
48 49
50
51 52 53 54 55 56 57 58 59 {%for mess in logdb%} 60 61 62 63 64 65 66 {%endfor%} 67 68
timehostlevelmessage
{{mess.time}}{{mess.host}}{{mess.level}}{{mess.message}}
69 70
71 72

log.html

日志采集与邮件推送模块

1 import pymysql,time
2 class db:
3 def __init__(self):
4 self.conn = pymysql.connect(host='127.0.0.1',port = 3306,user = 'root',passwd = 'd****', db='log')
5 self.coursor = self.conn.cursor()
6 def write(self,host,level,message):
7 ltime = time.strftime('%Y-%m-%d',time.localtime(time.time()))
8 sql = 'insert into swlog_log(host,level,message,time) values("%s","%s","%s","%s")'%(host,level,message,ltime)
9 self.coursor.execute(sql)
10 self.conn.commit()
11 self.conn.close()

sql.py

1 import email
2 import smtplib
3 from email.header import Header
4 from email.utils import formataddr
5 from email.mime.text import MIMEText
6 class sendemail():
7 def __init__(self,email_list,content,subject):
8 self.email_list = email_list
9 self.content = content
10 self.subject = subject
11 def sendemail(self):
12 msg = MIMEText(self.content,'plain','utf-8')
13 msg['from'] = formataddr(['dark','97****@qq.com'])
14 msg['subject'] = self.subject
15 service = smtplib.SMTP('smtp.qq.com')
16 service.login('97****@qq.com','ilz****')
17 service.sendmail('97****@qq.com',self.email_list,msg.as_string())
18 service.quit()

sendmail.py

1 import re
2 def syslog(date):
3 date = date.replace('\"','\'')
4 pri = re.findall('\d+',date)[0]
5 pri = int(pri)
6 level = re.findall('<\d+>',date)[0]
7 date = date.replace(level,'').strip()
8 if pri%8 == 0:
9 div_class = 'emerg'
10 elif pri%8 == 1:
11 div_class = 'alert'
12 elif pri%8 == 2:
13 div_class = 'crit'
14 elif pri%8 == 3:
15 div_class = 'error'
16 elif pri%8 == 4:
17 div_class = 'warning'
18 elif pri%8 == 5:
19 div_class = 'notice'
20 elif pri%8 == 6:
21 div_class = 'info'
22 elif pri%8 == 7:
23 div_class ='debug '
24 return date,div_class

formstr.py

1 import socket,re,os,subprocess
2 from log.sock import formstr,sql
3 from log.sock.sendmail import sendemail
4 import time
5
6 def logserver():
7 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
8 address = ('10.0.64.61',514)
9 s.bind(address)
10 mail_level = ['error','crit','alert','emerg']
11 while True:
12 data,address = s.recvfrom(10240)
13 data = data.decode(encoding='utf8')
14 data,div_class = formstr.syslog(data)
15 write_db = sql.db()
16 write_db.write(address[0],div_class,data)
17 if div_class in mail_level:
18 title = '主机%s,严重等级%s'%(address[0],div_class)
19 mail = sendemail(['cs11241991@163.com','dark@lonlife-inc.com'],data,title)
20 mail.sendemail()

bin.py

功能测试

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器