日志文件切分讲解
咱們繼續講下一個小知識點,這些都是非常細粒度的小知識點,Nginx入門的時候都會有一個小的例子,你做Nginx剛剛入門的時候,官網上會有一個很經典的例子,Nginx里面有三個很經典的例子,剛開始學的時候,我剛開始接觸Nginx的時候,有3個非常經典的hello world的例子,第一個例子就相當于把nginx搭建好,看到welcome use nginx這個東西,然后第二個例子就是你要做log的一個切分,就是一個分割log split,第三個就是做upstream這個東西,就是負載均衡的Hello world,基本上這三個hello world示例,你要是做好了之后,基本上你nginx就已經入門了,大概就已經入門了,現在就來做第二個小例子,就是日志的切分,這塊是一個什么樣的概念呢,看我的PPT
其實很簡單,花不了幾分鐘就完事了,知道日志對于互聯網是很重要的,你的訪問量啊,在我們日常生活中,對nginx日志的分析非常的重要,通常運維要對nginx的日志進行切分和處理,比如比較大的網站,一天可能就會有好多的訪問量,就是一過來,就你一個日志文件log的話,就太大了,一般我們可能都要做拆分,每隔一小時,每隔一天,因為你一天可能就是幾百兆,有時候可能就是一個G的日志,這是很有可能的,你像天貓那種服務器,他都不是每天備份日志,基本上我估計,就是壓力大的時候,基本上一個小時就得來一次,就是備份日志文件,備份幾份,放到hadoop上啊,放在storm上啊,做一些分析處理,根據你format里面配的一些東西,做一些什么分析啊,很簡單,那我們的nginx日志你會發現呢,咱們來看一下我們剛才的日志文件,cd 到logs下,日志文件就那這個為例
第一天訪問量都放在log里了,第二天也都放到這里了,第三天也都放到這里了,那如果你并發很大的話,是不是所有請求的日志信息都會放到這個logs里,這個很不好,一般小型網站需要一兩天備份一次,然后中型網站就是一天備份一次,那這個怎么去做備份呢,就是寫一些簡單的shell,可以去完成這個事情,那我們去把日志做切分,做分析處理,備份到你的磁盤上,怎么去做呢很簡單,首先去寫一個shell,把這個日志文件移動到其他的地方,然后重新生成一個就OK了,第二個就是定時的去crontab,就是定時的去做備份,基本上就是這兩件事,首先我們看第一件事,這個代碼我已經寫好了,你最好去熟悉一下,我這里有一個log.sh,我直接給他放在sbin目錄下,sbin下就是一個nginx,我直接把log.sh這個文件直接拽到這里,我們看看這個文件里面到底寫了啥直接vim log.sh
基本上行就是一個非常簡單easy的shell,首先我定義了一個directory,就是BASE_DIR,這是一個變量,就是一個局部變量,腳本內部有效的,shell腳本的話你自己去做一個復習,BASE_DIR是一個key,對應的value是/usr/loca/nginx,這是我的最基礎路徑,然后有一個BASE_FILE_NAME,然后我去寫了一個fileName,那這個fileName應該和我的什么fileName一致呢,基本上114我們來看一下,我感覺我這里不需要太改,cd /usr/loca/nginx,基本上cd到logs,我這個叫做這個名字
叫做bhz.com.access.log,就是這四個,就是這個文件名要和你生成的文件名一樣,這是我要進行備份的一個log日志,我要把它備份,接下來你CURRENT_PATH,就是用$BASE_DIR把這個變量取過來了,其實這個就相當于什么啊,其實就相當于/usr/local/nginx/logs,就是這個很簡單,BAK_PATH,這個我是需要再BASE_DIR下建立一個datalogs,這個就是我要備份的地方,BASE_DIR是什么啊,就是/usr/local/nginx這個位置,就是/usr/local/nginx下我要建立一個文件夾,叫做datalogs,咱們先不管,也不用退出,這個就是我的BASE_DIR
我去mkdir一下他,mkdir datalogs
這個文件夾建立好,就是多出一個datalogs文件夾,以后要把正常的日志文件備份到datalogs,這個文件夾下面,接下來就是我的CURRENT_FILE了,前面的CURRENT_PATH,$CURRENT_PATH就是/usr/local/nignx/logs,然后加上BASE_FILE_NAME再加上bhz.com.access.log,其實他就是logs下的這個文件,就是直接找到了這個文件,/usr/local/nignx/logs,然后是bhz.com.access.log,這個就是你當前的文件,然后接下來就是你的BAK_TIME,就是你每次備份日志的時候,總得有一個時間,記錄你當前日志的節點是多少時間,你可以隨便來一個,取昨天的,在工作中,一般是一天一備份,什么時間,一般是選擇后半夜,凌晨一兩點,凌晨兩點鐘你去備份,備份什么日志啊,備份昨天的日志,備份昨天一天的日志,這樣的話,你就得這樣去寫了,date -d yesterday,去找到昨天,然后什么時候,到哪一個節點為止,然后這個路徑,這個TIME就是你要備份文件的具體內容,一般是不加這個的,一般我要把這個去掉,因為我要給你做一個例子,要把小時和分鐘去掉,其實就是昨天,昨天給我記錄一下比如昨天是2016年0424,基本上前面就是這樣,就是20160424,基本上BAK_TIME就是一天的,不用考慮這個分鐘,他基本上一分鐘一備份能看到這個效果,其實工作中一天一備份就夠了,所以不用考慮這一塊,把昨天備份的日志日期給我輸出一下,就OK了,然后我接下來BAK_FILE,備份的文件叫啥名,在BAK_PATH下,PATH就是datalogs下的,叫做BAK_TIME-$BASE_FILE_NAME,這塊可能就是20140424-bhz.com.access.log,就會產生這樣的一個文件,然后把BAK_FILE輸出一下,看一下是什么樣子的,其實這塊寫不寫都無所謂,主要看這塊怎么去做這個也很簡單,你備份之前先把nginx停掉,就是敲這個命令,-s stop停掉,停掉以后mv,把CURRENT_FILE移動到BAK_FILE,這個BAK_FILE就是移動到這個位置,就是把當前CURRENT_FILE,這個CURRENT_FILE是什么啊,在這里我寫一下吧,這個CURRENT_FILE其實是這樣的,就是mv空格,把這個文件移動到哪塊,移動到帶PATH下的這個路徑,這個BAK_PATH叫做什么啊,正常工作中時分秒去掉了,那可能就是這樣了,加上你這個BASE_FILE_PATH,其實我這個命令其實就是這么長的一個意思,先把nginx停掉,然后把輸出的日志移動到這下面,要把這個日志改一下名字,當天備份的時間,差不多就是這個意思,最后mv完了以后,重啟nginx,停一下就重啟,還會再次生成一個日志文件,能理解我說的意思吧,這個你回去敲敲,這個很簡單,分析這個shell腳本,變量倒來倒去的,為什么要這么導來導去的,就為了更方便,就是為了更好用,這個是一個命令賦值,就是把這個執行的結果賦給BAK_TIME這個,當然你也可以用${,你可以代替這個命令執行的結果賦給前面的變量,也可以$(你的命令),這個小點和小括號是相等的,也是表示執行的意思,差不多就是這個概念,保存退出,現在我們的腳本寫完了,腳本在哪啊,在這個sbin下面,cd到sbin下
這個你要執行還得授權,這塊是不是沒賦權,你這個命令要調到crontab里面去執行的話,你得賦權,簡單的賦權一下chmod 777 log.sh我就滿了這個權限
現在就放心大膽的去crontab -e,這個回去忘了就復習,這個是定時job的文件夾,crontab -e,就是這個crontab -e,這個要是不理解就去復習去,*/1就是每一分鐘去執行這個腳本,就是每一分鐘去備份一份就OK了,然后粘貼
寫完了,就是sh /usr/local/nginx/sbin/log.sh,我已經賦權777滿了,現在我就去保存,你就會發現每一分鐘就會執行一次那我就cd到datalogs,當前已經有了一個日志了
你會當前已經有了一個日志了,這個是22點11分,1分鐘備一次,現在是一個,我剛剛刷了三次,現在有兩個了
直接一分鐘給我來一次嗎
這里面是有4次,我換一個2
我現在就刷一次,看日志能不能來cd到logs下,其實剛才已經刷了兩次了,cat bhz.com.access.log
我刷三次
這里面就多了一次了,你自己回去試試吧,再看
多了一個文件了,在去cat一個3
每分鐘來幾個備份,你不能copy,只能mv,能不停機備份嗎,一般都會停的,其實怎么說呢,多個nginx,10個nginx,你做keepalived高可用,主備,很多種形式,總之你不會丟數據的,再說nginx啟動也非常的快,有個一兩秒鐘我的服務就起來了,nginx一般都是可以stop然后start,大體能理解我這個意思吧,就是一個很簡單的配合shell,日志備份的這一塊,移動端APP訪問nginx嗎,移動端一般不走,這塊我不太熟,移動端其實不是很安全的,因為我沒有做過移動端開發
?
總結
- 上一篇: Nginx_日志文件讲解
- 下一篇: Nginx_location配置讲解