nginx日志對(duì)于分析網(wǎng)站有極大的意義,如果我們有多個(gè)網(wǎng)站朦前,這些網(wǎng)站又分布在不同的服務(wù)器裂七,如何高效地分析這些nginx日志?這里有兩個(gè)問(wèn)題:
nginx日志要進(jìn)行切割家破,不然單個(gè)文件太大颜说,不便于分析
日志散落在不同的服務(wù)器,不便管理汰聋,尤其在遷站時(shí)门粪,容易丟失日志
日志按天切割
單一文件太大,就應(yīng)該對(duì)其進(jìn)行切割烹困,一般是以時(shí)間為單位進(jìn)行切割玄妈。有很多切割的方案,有些是借助第三方工具切割髓梅,有些是自己寫(xiě)腳本拟蜻,這些方案都太重了,我希望僅需改nginx的配置即可完成枯饿,實(shí)現(xiàn)如下:
if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})") {
set $year $1;
set $month $2;
set $day $3;
}
access_log /var/log/test/access_$year-$month-$day.log;
error_log /var/log/test/error.log;
以下幾點(diǎn)需要注意:
nginx日志目錄要先建好酝锅,且必須對(duì)nginx開(kāi)放權(quán)限,不然記錄不到日志
error_log 不能使用變量奢方,直接解析成字符串搔扁,因此只能是單一文件
以上配置后,就會(huì)生成access_2019-04-06.log
格式的日志
日志歸集
原理很簡(jiǎn)單蟋字,寫(xiě)一個(gè)腳本稿蹲,將不同服務(wù)器的日志同步到其中一臺(tái)服務(wù)器,每天凌晨定時(shí)執(zhí)行愉老。
以下用python實(shí)現(xiàn):
import os
from datetime import date, timedelta
yesterday = date.today() - timedelta(1)
year = yesterday.strftime("%Y")
month = yesterday.strftime("%m")
day = yesterday.strftime("%d")
find_command = 'find /www/web/test/nginx/log -type f -name "*.log" | grep {0}'.format(year+'-'+month+'-'+day)
paths = os.popen(find_command).read().split()
for path in paths:
dist_path = 'username@192.168.1.12:' + path
scp_command = "scp {0} {1}".format(path, dist_path)
os.system(scp_command)
代碼講解:
獲取前一天日志场绿,拼接nginx日志路徑
用find命令獲取日志的絕對(duì)路徑
通過(guò)scp命令將日志傳送到目標(biāo)服務(wù)器
再將這個(gè)腳本設(shè)置成crontab定時(shí)執(zhí)行
各個(gè)服務(wù)器之間要先建立ssh信任通道,這樣才能用scp免密碼傳送
日志集中到一臺(tái)服務(wù)器后,就可以很方便地進(jìn)行日志分析