目錄
一、MongoDB logRotate命令
在MongoDB數據庫admin數據庫下執行logRotate命令手動觸發日志切換,切換后會將原日志文件以時間為后綴重命名並創建一個全新且為空的日志文件供MongoDB使用。
- shard1.log.2019-10-31T06-09-03
mongo> use admin
mongo> db.adminCommand({ logRotate: 1 })
二、操作系統層kill信號
可通過對MongoDB運行的進程pid發送
-SIGUSR1
的kill操作實現與logRotate命令相同的功能
- 找到MongoDB運行的pid文件或使用ps -ef|grep mongod查看進程ID號
- 執行kill -SIGUSR1
pid
## 查看MongoDB進程ID
shell> cat /data/mongodb/shard1.pid
57070
shell> ps -ef|grep mongod|grep shard1|grep -v grep
mongodb 57070 1 0 Oct29 ? 00:14:44 /usr/local/mongodb/bin/mongod --config /data/mongodb/conf/shard1.conf
## 觸發日志切換
shell> kill -SIGUSR1 57070
## 驗證日志切換
shell> ls -ltr shard1.log*
-rw-rw-r-- 1 mongodb mongodb 7344355 Aug 29 09:38 shard1.log.2019-08-29T01-38-15
-rw------- 1 mongodb mongodb 853458949 Oct 31 14:09 shard1.log.2019-10-31T06-09-03
-rw------- 1 mongodb mongodb 6679 Oct 31 14:13 shard1.log.2019-10-31T06-13-30
-rw------- 1 mongodb mongodb 8579 Oct 31 14:20 shard1.log
三、使用操作系統logrotate功能
Linux logrotate被設計用來對各服務產生的大日志文件進行歸檔處理,默認情況下logrotate每天基於cron job自動觸發觸發,以下是logrotate功能特點
- 支持自動日志歸檔
- 支持對歸檔的日志進行壓縮
- 支持對歸檔操作發送郵件提醒
- 支持基於每天、每周、每月、每年等維度進行歸檔策略
- 支持日志達到指定大小的歸檔策略
- 支持在日志歸檔期間進行額外的操作(如重啟某服務)
- 支持歸檔過程中的常見錯誤處理機制(如文件不存在、文件為空等)
1. 常用參數說明
weekly 每周進行切換
rotate 保留12份歸檔日志文件
olddir 指定歸檔的目錄
missingok 如不存在該文件也不報錯且進入下一輪
minsize 指定日志多大時進行切換,單位字節,可與weekly、monthly一起使用
dateext 對歸檔的日志文件增加日期后綴,默認格式'%Y%m%d'
copytruncate
notifempty 如果日志文件為空,不會進行日志歸檔切換
compress 對歸檔的日志進行壓縮,默認用gzip壓縮,文件名以'.gz結尾'
2. copy與copytruncate的差異
copy
- 原樣拷貝一份相同的日志文件后,不清空原日志文件
copytruncate
- 原樣拷貝一份相同的日志文件后,清空原日志文件,該方式不同於將文件先move后新建一個同名文件的方式,主要是針對一些程序在文件的inode改變后無法正常寫入日志的情況,對於大日志文件,通過這種方式進行日志的truncate操作期間,會有短暫的處理時間,在這端時間內產生的日志將不會輸出到原本的日志文件,所以會有少量數據丟失情況。
3. 配置示例
場景需求說明
- 每周進行切換
- 保留10份歷史日志
- 歷史日志保留在/data/mongodb/log/目錄下
- 如果文件不存在也不報錯
- 歸檔的日志增加時間擴展名
- 指定需要達到1G才進行歸檔
- 使用先拷貝日志在清空的方式進行歸檔
- 對歸檔的日志進行gzip壓縮
shell> vim /etc/logrotate.d/mongodb-shard1
/data/mongodb/log/shard1.log
{
weekly
rotate 10
olddir /data/mongodb/log/
missingok
dateext
minsize 104857600
copytruncate
notifempty
compress
create 0644 mongodb mongodb
}
## 手動觸發
shell> logrotate -vf /etc/logrotate.d/mongodb-shard1
## 驗證
shell> ll /data/mongodb/log/*.gz
-rw------- 1 mongodb mongodb 2670 10月 31 15:18 /data/mongodb/log/shard1.log-20191031.gz