網站首頁 編程語言 正文
前言
nginx默認沒有提供對日志文件的分割功能,所以隨著時間的增長,access.log和error.log文件會越來越大,尤其是access.log,其日志記錄量比較大,更容易增長文件大小,影響日志寫入性能
分割nginx日志的方法有很多,這里推薦利用Logrotate來完成
Logrotate用法
1.安裝
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
2.基本用法詳解
2.1 入門
/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個參數解釋如下:
- daily:按天切割。觸發切割時如果時間不到一天不會執行切割。除了daily,還可以選monthly,weekly,yearly
- rotate:對于同一個日志文件切割后最多保留的文件個數
- copytruncate:將源日志文件切割成新文件后,清空并保留源日志文件。默認如果不啟用該配置,分割后源日志文件將被刪除。設置該值,以便分割后可以繼續在源日志文件寫入日志,等待下次分割
- missingok:切割中遇到日志錯誤忽略
創建好配置以后,系統會在每天利用cron定時執行logrotate日志分割指令。這里我們為了看到效果,不等到系統自動執行,可以手動強制執行一次日志分割。強制執行會立即進行一次日志
# -v:顯示執行日志 # -f:強制執行分割 logrotate -vf /etc/logrotate.d/test
執行前,事先在日志所在目錄中創建2個測試日志文件
touch test1.log touch test2.log
手動執行一次日志分割,觀察執行日志可以發現,過程如下:
- 先將源日志內容拷貝到分割后的文件
- 清空源文件
此時分割后的文件名為源文件名后面加上.序號,序號從1開始
然后我們再次手動執行一次分割,此時執行過程如下:
- 將第一次分割后的日志文件test1.log.1重命名為test1.log.2
- 將源日志文件拷貝到此次分割后的文件,命名序號重新從1開始,為test1.log.1
- 清空源日志文件
接著再次手動執行一次分割,此時執行過程如下:
- 將之前分割后的日志文件test1.log.2重命名為test1.log.3,test1.log.1重命名為test1.log.2
- 分割源日志文件,拷貝其內容到test1.log.1
- 由于設置了rotate為2,即最多保留2個日志文件,所以此時要刪除最早分割出的那個日志文件,即test1.log.3
總結一下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續寫日志
注意:
- /etc/logrotate.d中的自定義配置中,如果不配置rotate、daily等參數在強制手動執行時并不會繼承默認的主配置/etc/logrotate.conf。比如不配置rotate時,并不會繼承保留4個分割文件,而是等價于0,即不保留任何分割文件。所以自定義配置中推薦顯式指定這些參數
- 在系統crontab定時任務自動執行logrotate時,自定義配置會繼承主配置文件中的參數
- logrotate執行分割的時機要依賴于crontab定時任務,也就是說crontab定時任務每日觸發時,logrotate才會讀取相應配置,檢查是否滿足分割的條件決定是否執行分割。這意味著,在默認crontab每日觸發logrotate的定時任務情況下,即便logrotate配置文件中配置的分割頻率小于1天,也將按照1天的頻率觸發分割,除非修改crontab定時任務,將logrotate的任務觸發頻率修改為小于1天
2.2 分割文件壓縮
我們可以通過如下設置對分割后的日志文件開啟壓縮
/opt/logtest/*.log { daily rotate 2 copytruncate missingok compress # 以gzip方式壓縮 nodelaycompress # 所有分割后的文件都進行壓縮 }
此時刪除原有所有文件,重新創建測試日志文件test1.log和test2.log,然后手動執行分割,可以生成壓縮后的.gz文件
一般可以將nodelaycompress改為delaycompress,這樣分割后對最新的序號為1的文件不會進行壓縮,對其他序號的文件進行壓縮,這樣可以方便我們查看最新的分割日志
2.3 按照時間分割
按照時間分割可以定時分割出一個日志,比如每天分割一次,配合其他參數可以完成保留最近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 }
2.4 按照文件大小分割
我們可以利用size配置指定當日志文件達到多大體積時才進行分割。以下配置指定了每天執行分割,但是只有當日志文件大于5M時才真正執行分割操作
/opt/logtest/*.log { daily # 每天分割一次 size 5M # 源文件小于5M時不分割 rotate 30 # 保留最近30個分割后的日志文件 create missingok dateext # 切割后的文件添加日期作為后綴 dateyesterday # 配合dateext使用,添加前一天的日期作為分割后日志的后綴 }
注意:這個配置并不是說日志文件達到指定大小就自動執行分割,它還是要遵循定時任務。比如配置了daily只有到每天指定時間執行分割任務時,才會檢查文件大小,對超過指定大小的文件進行分割
2.5 自定義每小時分割
logrotate實現每日定時執行日志分割的原理是通過cron定時任務,默認在/etc/cron.daily中包含logrotate可執行命令,所以系統每天會定時啟動logrotate,然后它會根據配置中具體分割頻率(daily、weekly等)以及其他條件(比如size)決定是否要真正執行分割操作
如果我們想要實現每小時進行一次分割,需要如下步驟:
- logrotate配置文件中指定分割頻率為hourly
- 配置完以后,還需要在cron的每小時定時任務中加入logrotate,因為默認情況下只有/etc/cron.daily中包含logrotate可執行命令,我們要將它往/etc/cron.hourly中也拷貝一份,這樣系統才會每小時調用一次logrotate去執行分割
cp /etc/cron.daily/logrotate /etc/cron.hourly/
2.6 自定義分割執行時間
logrotate 是基于cron 運行的,所以這個時間是由 cron 控制的,具體可以查詢 cron 的配置文件/etc/crontab 。舊版CentOS 的cron 的配置文件是 /etc/crontab ,新版CentOS 改為 /etc/anacrontab
從上面的內容可以看出:
- 如果機器 沒有關機,默認 logrotate(配置文件里設置的是cron.daily)一般會在每天的3點05分到3點50分之間執行, 真實的延遲時間是RANDOM_DELAY + delay in minutes
- 如果在3-22 這個時間段內服務器處于 關機狀態,則 logrotate 會在機器開機5分鐘后執行分割日志的操作
如果我們覺得每天凌晨3點多執行日志分割不合適,那么可以自定義分割執行時間。實現方式可以是:
- 修改/etc/anacrontab中的定時執行時間,實際不推薦,可能會影響系統其他定時任務
- 在/etc/logrotate.d以外的其他目錄創建logrotate配置文件,然后利用crontab自定義cron表達式來執行logrotate對該配置進行分割操作
推薦采用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
nginx日志分割步驟
在/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
總結
原文鏈接:https://blog.csdn.net/m0_54853503/article/details/124776912
相關推薦
- 2023-12-15 Linux系統——退出vi編輯模式
- 2022-10-28 Go語言開發保證并發安全實例詳解_Golang
- 2023-10-16 微信小程序radio單選按鈕選中與取消
- 2022-10-18 C++數據結構之二叉搜索樹的實現詳解_C 語言
- 2022-09-06 C語言常見排序算法歸并排序_C 語言
- 2022-11-17 Python?Scala中使用def語句定義方法的詳細過程_python
- 2023-08-13 ps打開之后切圖一段時間C盤存儲量變小怎么清理?
- 2024-03-28 Springboot maven加入本地jar,提示找不到類
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支