1 場景
應用使開發寫的,但應用使部署再服務器上,而開發沒有ssh登陸服務器的權限。
so,開發總是請運維查日志,下載日志。
so and so,運維要花很多時間幫開發去搞日志。
這是件很沒意義的事,所以必須kill
2 解決思路
首先想到的就是大名鼎鼎的ELK,試行了一段時間,結果暴斃。暴斃原因:
a 日志的目的是分析錯誤,所以info級別的日志沒用,需要debug級別的,而業務體量大,導致日志很大,在網絡傳輸、存儲、ELK管理集群硬件成本上都是不小的負擔。
b ELK有過濾后再存儲的功能,但前提是日志標准化的推進。標准化沒有推,所以回到a問題
c 開發人員習慣用文本編輯器(notepad++等)查日志,覺得這個更好用。
所以換成web服務,用django做web框架,saltstack做遠程命令執行,在web表格中提交相關日志信息的關鍵字,把對應服務器上的日志下載到本地。解決了關鍵問題:
讓開發自己去下日志吧~~~
ssh登錄線上服務器是不可能滴~~~
step1-基本框架
使用django自帶的form模塊,在web的form中,使用post提交指令,指向具體的服務器和日志信息
然后在服務端調用saltstack,到目標服務器上執行日志的壓縮命令,並且把壓縮文件復制到指定目錄
在nginx中配置localtion,可以下載到這個文件
使用django自動去下載這個文件
views:
注:xx代表業務參數
from django.shortcuts import render,HttpResponse from django.http import FileResponse from .forms import AddForm import subprocess # Create your views here. def LogServer(request): if request.method == 'POST': form = AddForm(request.POST) if form.is_valid(): # 獲取參數 server = form.cleaned_data['server'] subtype = form.cleaned_data['xx'] logpath = form.cleaned_data['logpath'] # 執行命令 zip_cmd = 'cd %s;zip a.zip `ls | grep ^xx%d`' %(logpath,xx) upload_cmd = 'cp %s;cp a.zip /data/download/' %logpath salt_cmd = "salt %s cmd.run '%s;%s'" %(server,zip_cmd,upload_cmd) subprocess.Popen(salt_cmd,stdout=subprocess.PIPE, shell=True) #返回文件給客戶端 file_dir = '%s/a.zip' %logpath file = open(file_dir, 'rb') response = FileResponse(file) response['Content-Type'] = 'application/octet-stream' response['Content-Disposition'] = 'attachment;filename="a.zip"' return response else: form = AddForm() return render(request, 'dosql.html', {'form': form})
step2-web端可選擇應用
業務環境換到分布式上來,在單台服務器上,在web端可以下載指服務組件的日志