<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
nginx預設沒有提供對紀錄檔檔案的分割功能,所以隨著時間的增長,access.log和error.log檔案會越來越大,尤其是access.log,其紀錄檔記錄量比較大,更容易增長檔案大小,影響紀錄檔寫入效能
分割nginx紀錄檔的方法有很多,這裡推薦利用Logrotate來完成
logrotate是一個linux系統紀錄檔的管理工具。可以對單個紀錄檔檔案或者某個目錄下的檔案按時間/大小進行切割,壓縮操作;指定紀錄檔儲存數量;還可以在切割之後執行自定義命令
logrotate是基於crontab執行的,所以這個時間點是由crontab控制的,具體可以查詢crontab的組態檔/etc/anacrontab。系統會按照計劃的頻率執行logrotate,通常是每天。在大多數的Linux發行版本上,計劃每天執行的指令碼位於/etc/cron.daily/logrotate
主流Linux發行版上都預設安裝有logrotate包,如果你的linux系統中找不到logrotate, 可以使用apt-get或yum命令來安裝
yum install -y logrotate
一般linux都已經自帶logrotate,下列命令可以檢視是否已安裝
rpm -ql logrotate
/etc/logrotate.conf這個檔案是logrotate的主組態檔
# see "man logrotate" for details # rotate log files weekly weekly # keep 4 weeks worth of backlogs rotate 4 # create new (empty) log files after rotating old ones create # use date as a suffix of the rotated file dateext # uncomment this if you want your log files compressed #compress # 包含自定義設定目錄 include /etc/logrotate.d # no packages own wtmp and btmp -- we'll rotate them here /var/log/wtmp { monthly create 0664 root utmp minsize 1M rotate 1 } /var/log/btmp { missingok monthly create 0600 root utmp rotate 1 } # system-specific logs may be also be configured here.
這個主組態檔中定義了紀錄檔檔案分割的通用引數。並且include /etc/logrotate.d表示其會載入/etc/logrotate.d的所有自定義組態檔,自定義組態檔中的設定可以覆蓋掉通用設定
我們來到自定義組態檔的目錄/etc/logrotate.d
嘗試在該目錄中建立一個紀錄檔分割設定test,對/opt/logtest目錄中所有以.log結尾的檔案進行分割
vim test # test組態檔的內容 /opt/logtest/*.log { daily rotate 2 copytruncate missingok }
test設定的第一行指定要對哪個路徑的哪些檔案進行分割,然後攜帶的4個引數解釋如下:
建立好設定以後,系統會在每天利用cron定時執行logrotate紀錄檔分割指令。這裡我們為了看到效果,不等到系統自動執行,可以手動強制執行一次紀錄檔分割。強制執行會立即進行一次紀錄檔
# -v:顯示執行紀錄檔 # -f:強制執行分割 logrotate -vf /etc/logrotate.d/test
執行前,事先在紀錄檔所在目錄中建立2個測試紀錄檔檔案
touch test1.log touch test2.log
手動執行一次紀錄檔分割,觀察執行紀錄檔可以發現,過程如下:
此時分割後的檔名為原始檔名後面加上.序號,序號從1開始
然後我們再次手動執行一次分割,此時執行過程如下:
接著再次手動執行一次分割,此時執行過程如下:
總結一下logrotate紀錄檔分割的步驟:
1.預設分割後紀錄檔的命名為源紀錄檔名稱+.序號(從1開始)。分割之前將所有之前分割出的紀錄檔檔案重新命名,序號往後移一位
2.執行分割,將源紀錄檔檔案分割為源紀錄檔檔名.1。這樣就保證了所有分割後的檔案中,序號最小的是最新分割出的,序號最大的是最早分割出的
3.根據rotate設定,如果此次分割後檔案數量大於rotate設定,那麼刪除序號最大的那個分割檔案,也就是最舊的分割紀錄檔
實際開發中可以使用create代替copytruncate,它們的區別如下:
copytruncate先將原始檔內容拷貝到分割後檔案,再清空原始檔,拷貝和清空之間有時間差,可能會丟失部分紀錄檔。另外拷貝操作在原始檔比較大時消耗效能
create直接將原始檔重新命名為分割後檔案,再建立一個與原始檔名稱相同的新檔案,用於後續紀錄檔寫入
/opt/logtest/*.log { daily rotate 2 create # 建立與原始檔名稱相同的新檔案,用於後續紀錄檔寫入,新檔案的歸屬使用者、許可權與原始檔相同 missingok }但是要注意create即使建立新的檔案後,如果沒有主動通知應用程式,那麼應用程式仍然會往舊的檔案(即被重新命名的那個分割後的檔案)寫入紀錄檔。所以此時在分割後要通知應用程式重新開啟新的紀錄檔檔案進行寫入。以通知nginx為例,設定如下
/var/log/nginx/*.log { daily rotate 30 create sharedscripts # 所有的檔案切割之後只執行一次下面指令碼,通知nginx重新開啟新的紀錄檔檔案進行後續寫入 postrotate if [ -f /run/nginx.pid ]; then kill -USR1 `cat /run/nginx.pid` # 通過USER1訊號通知nginx重新開啟紀錄檔檔案 fi endscript }綜上,一般情況下如果應用程式提供了通知其開啟新的紀錄檔檔案的介面,那麼推薦使用create續寫紀錄檔;否則推薦使用copytruncate續寫紀錄檔
注意:
我們可以通過如下設定對分割後的紀錄檔檔案開啟壓縮
/opt/logtest/*.log { daily rotate 2 copytruncate missingok compress # 以gzip方式壓縮 nodelaycompress # 所有分割後的檔案都進行壓縮 }
此時刪除原有所有檔案,重新建立測試紀錄檔檔案test1.log和test2.log,然後手動執行分割,可以生成壓縮後的.gz檔案
一般可以將nodelaycompress改為delaycompress,這樣分割後對最新的序號為1的檔案不會進行壓縮,對其他序號的檔案進行壓縮,這樣可以方便我們檢視最新的分割紀錄檔
按照時間分割可以定時分割出一個紀錄檔,比如每天分割一次,配合其他引數可以完成保留最近n天紀錄檔的功能。以下設定可以實現每天分割一次紀錄檔,並且保留最近30天的分割紀錄檔
/opt/logtest/*.log { daily # 每天分割一次 rotate 30 # 保留最近30個分割後的紀錄檔檔案 copytruncate missingok dateext # 切割後的檔案新增日期作為字尾 dateyesterday # 配合dateext使用,新增前一天的日期作為分割後紀錄檔的字尾 }
還是先刪除原來的所有檔案,重新建立
touch test{1,2}.log
再手動執行分割,此時生成的分割後的檔案將不再以序號作為檔名結尾,而是以昨天的日期作為結尾
並且如果馬上再手動執行一次分割,由於日期相同,不會像原來一樣生成序號遞增的新紀錄檔檔案,此時相當於沒有執行任何分割操作。即同一天只能分割一次,第二天再次執行才會分割出新的日期結尾的檔案,所以此時設定rotate的值即為保留最近多少天紀錄檔的意思
此外,預設新增的日期字尾格式為yyyyMMdd,可以用dateformat自定義
/opt/logtest/*.log { daily # 每天分割一次 rotate 30 # 保留最近30個分割後的紀錄檔檔案 copytruncate missingok dateext # 切割後的檔案新增日期作為字尾 dateyesterday # 配合dateext使用,新增前一天的日期作為分割後紀錄檔的字尾 dateformat -%Y-%m-%d # 格式為2022-02-08 }
我們可以利用size設定指定當紀錄檔檔案達到多大體積時才進行分割。以下設定指定了每天執行分割,但是隻有當紀錄檔檔案大於5M時才真正執行分割操作
/opt/logtest/*.log { daily # 每天分割一次 size 5M # 原始檔小於5M時不分割 rotate 30 # 保留最近30個分割後的紀錄檔檔案 create missingok dateext # 切割後的檔案新增日期作為字尾 dateyesterday # 配合dateext使用,新增前一天的日期作為分割後紀錄檔的字尾 }
注意:這個設定並不是說紀錄檔檔案達到指定大小就自動執行分割,它還是要遵循定時任務。比如設定了daily只有到每天指定時間執行分割任務時,才會檢查檔案大小,對超過指定大小的檔案進行分割
logrotate實現每日定時執行紀錄檔分割的原理是通過cron定時任務,預設在/etc/cron.daily中包含logrotate可執行命令,所以系統每天會定時啟動logrotate,然後它會根據設定中具體分割頻率(daily、weekly等)以及其他條件(比如size)決定是否要真正執行分割操作
如果我們想要實現每小時進行一次分割,需要如下步驟:
cp /etc/cron.daily/logrotate /etc/cron.hourly/
logrotate 是基於cron 執行的,所以這個時間是由 cron 控制的,具體可以查詢 cron 的組態檔/etc/crontab 。舊版CentOS 的cron 的組態檔是 /etc/crontab ,新版CentOS 改為 /etc/anacrontab
從上面的內容可以看出:
如果我們覺得每天凌晨3點多執行紀錄檔分割不合適,那麼可以自定義分割執行時間。實現方式可以是:
推薦採用crontab方式自定義執行時間,步驟如下:
在非/etc/logrotate.d目錄建立logrotate組態檔,這是為了避免被系統的定時任務掃描到該設定而導致重複執行分割
新增 crontab 計劃任務,在 root 使用者下執行crontab -e
進入 vim 模式,進行編輯
crontab -e # 每天 23點59分進行紀錄檔切割 59 23 * * * /usr/sbin/logrotate -f /etc/logrotate_mytime/nginx
重啟crontab
# centos6: service crond restart # centos7: systemctl restart crond
在/etc/logrotate.d中建立檔案nginx,作為nginx紀錄檔分割的組態檔。指定每天執行一次分割,並且當檔案大於5M時才進行分割。同時指定notifempty,當紀錄檔檔案為空時不分割
/opt/docker-ws/nginx/logs/*.log { daily # 每天分割一次 size 5M # 原始檔小於5M時不分割 rotate 30 # 保留最近30個分割後的紀錄檔檔案 copytruncate notifempty # 當紀錄檔檔案為空時不分割 missingok dateext # 切割後的檔案新增日期作為字尾 }
這樣設定了以後系統會在凌晨3點多執行分割操作,執行結果會儲存到/var/spool/mail/root中
檢視結果發現提示許可權不夠而分割失敗,這是因為開啟了selinux導致,解決方案有如下2種:
1、關閉selinux/2、利用semanage修改待分割的紀錄檔檔案所在目錄的許可權
# 開放/opt/logtest目錄的許可權 semanage fcontext -a -t var_log_t "/opt/logtest(/.*)?" restorecon -Rv /opt/logtest
到此這篇關於Nginx利用Logrotate紀錄檔分割的文章就介紹到這了,更多相關Nginx紀錄檔分割內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45