原文鏈接:http://loonlog.com/2020/1/7/uwsgi-log-divided-by-day/
最近網站被頻繁的攻擊,需要經常查看uwsgi日志,進行分析,查找可疑ip,進行黑名單設置;在查看uwsgi日志的時候發現uwsgi日志很大,有上百M,下載很不方面,並且打開日志和查看日志均不是很方便;
最理想的就是每天一個日志文件,方面管理和查看。
uwsgi沒有提供按天切割日志的配置,只提供了一個log-maxsize配置,當文件達到多大的時候自動切分,對於查找歷史日志還是很不方便,我們一般是按照時間查詢。
我是小白,根據網上的資料,歸納總結,並加以菜鳥備注呈現給大家;
原理就是:配合sh+crontab腳本技術,用mv+touch-logreopen參數,移動日志文件后,讓uwsgi重新打開日志並記錄。
系統:centos 7 (其他系統也是一樣的)
應用:django + uwsgi + nginx 的 web 應用 (只要有uwsgi,配置也是一樣的)
-
在uwsgi的配置文件 uwsgi.xml 中,添加 touch-logreopen配置
(我的情況是uwsgi 的配置文件在django項目根目錄下,其他情況也是一樣的原理):
<uwsgi> ... <!-- 進程在后台運行,並將日志打印到指定文件 --> <daemonize>./logs/uwsgi.log</daemonize> <!-- 進程在后台運行,並將日志打印到指定文件 --> <touch-logreopen>./logs/.touchforlogrotat</touch-logreopen> </uwsgi>
如果你的uwsgi配置文件是 ini 格式的,可以新增如下內容
#進程在后台運行,並將日志打印到指定文件 daemonize = ./logs/uwsgi.log #設置一個監聽對象 touch-logreopen = ./logs/.touchforlogrotat
關於路徑問題,大家根據自己的情況規划即可,因為uwsgi配置文件在項目根目錄,因此上面的路徑 ./logs/uwsgi.log的意思是在uwsi配置文件所在的目錄中的一個文件夾logs,uwsgi.log就在logs這個文件夾內。
以上配置結合下面的腳本文件作用的原理是:當監聽對象 touch-logreopen 所指向的文件被touch,時間戳改變后,當前的uwsgi.log文件會重新按照日期命名,並保存在相應的文件夾,同時uwsgi會重新新建uwsgi.log文件進行寫入新日志,且不會中斷當前程序的執行。如果沒有touch-logreopen這個監聽對象,是無法對uwsgi.log進行轉儲的。
-
創建腳本文件
在系統根目錄的shell目錄中,新建一個.sh的腳本文件uwsgi_log_cut.sh,內容如下:
#!/bin/bash LOGDIR="/www/logs/" #當前日志所在目錄 DATE=`date -d "yesterday" +"%Y-%m-%d"` NEWDIR="/www/logs/history" #新建文件夾history用來放舊日志 mkdir -p ${NEWDIR} mv ${LOGDIR}/uwsgi.log ${NEWDIR}/uwsgi-${DATE}.log #將舊日志重新以日期命名 touch /www/logs/.touchforlogrota
這里面的文件路徑www在系統根目錄,我django項目就在www文件夾。
-
腳本的運行設置
通過crontab設置定時任務,命令行下輸入:
crontab -e
會進入一個當前用戶的文件,在這個文件中添加下面這行操作:''' * * * * * 執行任務 第一個* 一小時當中的第幾分鍾:0-59 第二個* 一天當中的第幾個小時:0-23 第三個* 一月當中的第幾天:1-31 第四個* 一年當中的第幾個月:1-12 第五個* 一周當中的第幾個星期:0-7 0,7都代表周日 ''' 0 0 * * * sh /shell/uwsgi_log_cut.sh #代表每天0點執行腳本 uwsgi_log_cut.sh
這里的原理就是每天0點執行系統根目錄中shell文件夾中的uwsgi_log_cut.sh文件。
最后重啟uwsgi,logs文件中的history文件夾都會有每天的日志了
以上的路徑大家不要弄混淆,根據你的結構進行設置即可。有問題可以留言,我也是小白,說的有點啰嗦,請諒解一下;以上的腳本寫法有很多,我也沒太理解,我現在這個我認為精明扼要。