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端可以下載指服務組件的日志
