前言:
來到新公司,領導下發了個需求:每週需要對服務器進行一個巡檢,以及分析ngxin趨勢,由於公司實際生產環境服務器不是特別多,考慮暫時先用腳本完成該需求。
大致思路:收集數據 -> 寫入excel製成圖表 -> 發郵件
一、收集nginx數據
主要是對nginx log進行一個分析,統計數據。公司使用系統自帶的logrotate切割nginx日誌,只保存10天日誌,並且壓縮起來,使用shell分析出來會出現兩個日期,遂:將日誌文件拷貝到其他路徑,解壓,並逐個分析,腳本如下:
#!/bin/bash LogName=nginx.access.log* #日誌文件名 LogPath=/var/log/nginx/nginx.access.log* #日誌路徑 NginxPath=/data/scripts/NginxLog/ #解壓日誌路徑 Filename=/data/scripts/NginxLog/nginx.log #數據收集文件 Temporary=/data/scripts/NginxLog/temporary #一個臨時文件 #拷貝文件並解壓 `cp $LogPath $NginxPath` `gunzip $NginxPath$LogName` #由於日誌有兩個日期,比較蛋疼,下面輸出結果爲:13/May/2016 xxxx function Nglog() { for i in `awk 'gsub(/\[/," ",$0)' $1|awk -F ":| " '{++S[$5]}END {for (i in S) print i}'` do num=`grep "$i" $1|awk '{print $1}'|sort|uniq -c |wc -l` echo $i $num done } #目錄下所有日誌進行分析 for i in `ls $NginxPath|grep nginx.access.log` do Nglog $NginxPath$i >> $Temporary done #去掉2016,輸入到日誌 ACC=`awk '{a[$1]+=$2}END{for(i in a)print i,a[i]}' $Temporary|sort|sed 's/\/[0-9]\{4\}//g'` echo "$ACC" > $Filename #刪除臨時文件以及日誌文件 rm -rf $Temporary rm -rf $NginxPath$LogName
這樣就把日誌收集起來,那麼如何保存舊數據與新數據呢?
在根目錄寫另外一個腳本,每次執行前都把名字改成舊數據文件名
`mv $DataFile $LastData`
二、製成圖表
使用xlsxwriter生成,部分代碼如下:
#!/usr/bin/python # -*- coding: utf-8 -*- import xlsxwriter import time import linecache DataFile='/data/scripts/ServerData' LastFile='/data/scripts/LastData' ###處理nginx日誌 new_data = ngdata(DataFile) last_data = ngdata(LastFile) new_item=[] new_value=[] last_item=[] last_value=[] for i in new_data: new_item.append(i.split()[0]) new_value.append(int(i.split()[1])) for l in last_data: last_item.append(l.split()[0]) last_value.append(int(l.split()[1])) ###創建excel表格 Excel_name = "Server_%s.xlsx" % (time.strftime("%Y-%m-%d",time.localtime())) workbook = xlsxwriter.Workbook(Excel_name) worksheet = workbook.add_worksheet() ###項目的樣式 ItemStyle = workbook.add_format({ 'font_size':10, 'bold':True, 'bg_color':'#101010', 'font_color':'#FEFEFE', 'align':'center', 'align':'vcenter', 'top':2, 'left':2, 'right':2, 'bottom':2 }) ###目標值的樣式 ValueStyle = workbook.add_format({ 'font_size':9, 'font_color':'#151515', 'align':'center', 'align':'vcenter', 'top':2, 'left':2, 'right':2, 'bottom':2 }) ###寫入nginx 數據 row2 = 69 col2 = 0 col3 = 0 row3 = 74 col4 = 0 col5 = 0 worksheet.insert_textbox('D68','Nginx_New_Data',{'fill':{'none':True},'width':150,'height':35}) worksheet.insert_textbox('D73','Nginx_Last_Data',{'fill':{'none':True},'width':150,'height':35}) for nt in new_item: worksheet.write(row2,col2,nt,ItemStyle) col2 += 1 for nv in new_value: worksheet.write(row2+1,col3,nv,ValueStyle) col3 += 1 for lt in last_item: worksheet.write(row3,col4,lt,ItemStyle) col4 +=1 for lv in last_value: worksheet.write(row3+1,col5,lv,ValueStyle) col5 +=1 ###Nginx圖表 NginxChart = workbook.add_chart({'type':'line'}) #定義最新數據的線條顏色等 NginxChart.add_series({ 'categories':'=Sheet1!$A$70:$I$70', 'values':'=Sheet1!$A$71:$I$71', 'data_labels':{'value':True}, 'name':'New Data', 'line':{ 'color' : '#4A4AFF', 'width':2, }, }) #定義舊數據線條顏色等 NginxChart.add_series({ 'values':'=Sheet1!$A$76:$I$76', 'name':'Last Data', 'line':{ 'color' : '#BEBEBE', 'dash_type':'dash_dot', 'width':1, }, }) NginxChart.set_y_axis({'name':'Nginx'}) worksheet.insert_chart('A78',NginxChart) workbook.close()
效果圖:
三、發送郵件
生成excel後,發送郵件,部分代碼如下:
import smtplib from email.mime.text import MIMEText from email.MIMEMultipart import MIMEMultipart from email.MIMEBase import MIMEBase sender = '郵箱地址' receiver = ['發送人列表'] subject = 'Server Inspection(%s)' %(time.strftime("%Y.%m.%d",time.localtime())) smtpserver = 'smtp.163.com' username = '用戶名' password = '密碼' msg = MIMEMultipart('alternative') msg['Subject'] = subject html = """\ 郵件正文 """ part = MIMEText(html,'html','utf-8') #!這個地方要指定編碼,不然發郵會出現亂碼 msg.attach(part) att = MIMEText(open(Excel_name,'rb').read(),'base64','utf-8') att["Content-Type"] = 'application/octet-stream' att["Content-Disposition"] = 'attachment;filename=Server.xlsx' msg.attach(att) smtp = smtplib.SMTP() smtp.connect('smtp.163.com') smtp.login(username,password) smtp.sendmail(sender,receiver,msg.as_string()) smtp.quit()
最後
將腳本加入任務計劃,定製時間執行。
附上最後包裝效果: