1. 程式人生 > >應用日誌獲取-web系統

應用日誌獲取-web系統

1 場景

應用使開發寫的,但應用使部署再伺服器上,而開發沒有ssh登陸伺服器的許可權。

so,開發總是請運維查日誌,下載日誌。

so and so,運維要花很多時間幫開發去搞日誌。

這是件很沒意義的事,所以必須kill

2 解決思路

首先想到的就是大名鼎鼎的ELK,試行了一段時間,結果暴斃。暴斃原因:

a  日誌的目的是分析錯誤,所以info級別的日誌沒用,需要debug級別的,而業務體量大,導致日誌很大,在網路傳輸、儲存、ELK管理叢集硬體成本上都是不小的負擔。

b  ELK有過濾後再儲存的功能,但前提是日誌標準化的推進。標準化沒有推,所以回到a問題

c 開發人員習慣用文字編輯器(notepad++等)查日誌,覺得這個更好用。

所以換成web服務,用django做。在web表格中提交相關日誌資訊的關鍵字,把對應伺服器上的日誌下載到本地。解決了關鍵問題:

讓開發自己去下日誌吧~~~

ssh登入線上伺服器是不可能滴~~~

step1-簡單的檔案下載功能

使用django自帶的form模組,在web的form中,使用post提交一個指令,然後在服務端將nginx的日誌檔案壓縮併發送給客戶端下載。

from django.shortcuts import render,HttpResponse
from django.http import FileResponse
from .forms import AddForm
import zipfile

# Create your views here.
def LogServer(request):
    if request.method == 'POST':
        form = AddForm(request.POST)
        if form.is_valid():
            flag = form.cleaned_data['flag']
            if flag == 1:

                z = zipfile.ZipFile('accces.log.zip', 'w', zipfile.ZIP_DEFLATED)
                z.write('/app/nginx/logs/access.log')
                z.close()

                file = open('accces.log.zip', 'rb')
                response = FileResponse(file)
                response['Content-Type'] = 'application/octet-stream'
                response['Content-Disposition'] = 'attachment;filename="accces.log.zip"'
                return response

            else:
                return HttpResponse('try again')
    else:
        form = AddForm()
    return render(request, 'dosql.html', {'form': form})