截至到redis-5.0版本,redis仍然不會自動滾動日志文件,如果不處理則日志文件日積月累越來越大,最終將導致磁盤滿告警:
| # ls -lh total 12G -rw-r--r-- 1 redis redis 8.5G Feb 18 10:26 redis-6379.log -rw-r--r-- 1 redis redis 1.5G Feb 18 10:26 redis-6380.log -rw-r--r-- 1 redis redis 2.0G Feb 18 10:26 redis-6381.log |
查看redis的源代碼,可發現每次寫日志均是先fopen再fprintf,實現十分簡單,毫無日志滾動邏輯:
| // server.c void serverLogRaw(int level, const char *msg) { FILE *fp; 。。。。。。 fp = log_to_stdout? stdout: fopen(server.logfile,"a"); if (!fp) return; 。。。。。。 fflush(fp); if (!log_to_stdout) fclose(fp); if (server.syslog_enabled) syslog(syslogLevelMap[level], "%s", msg); } |
顯然,這是redis運維需要解決的。最易想到的是自己寫腳本滾動日志,比如直接利用日志滾動腳本工具log_rotater.sh。不過這里更推薦Linux系統自帶的日志滾動工具logrotate:
| # which logrotate /usr/sbin/logrotate # which rsyslogd /usr/sbin/rsyslogd |
Linux系統自帶的日志滾動工具logrotate由兩部分組成:一是命令行工具logrotate,二是后台服務rsyslogd。
使用rsyslogd,只需簡單的配置即可實現日志滾動。rsyslogd的配置文件為/etc/logrotate.conf,但一般不建議直接修改logrotate.conf,而是在目錄/etc/logrotate.d下新增文件的方式。logrotate.conf會include所有logrotate.d目錄下的文件,語法是一致的,區別是logrotate.conf定義了默認的配置,而logrotate.d目錄下為專有配置。
下列為redis的配置示例:
| # cat /etc/logrotate.d/redis /usr/local/redis/log/redis-6379.log /usr/local/redis/log/redis-6380.log /usr/local/redis/log/redis-6381.log { rotate 2 minsize 100M nocompress missingok create 0664 redis redis notifempty } |
配置項說明:
1) rotate指定日志文件備份數,如果值為0表示不備份
2) minsize表示日志文件達到多大才滾動
3) nocompress表示是否壓縮備份的日志文件
4) missingok如果日志丟失,不報錯繼續滾動下一個日志
5) notifempty日志文件為空時,不進行輪轉,默認值為ifempty
6) create指定創建新日志文件的屬性,logrotate是以root運行的,如果目標日志文件非root運行,則這個一定要指定好。
有關logrotate的詳細使用,請參考logrotate資料,本文不過多描述。
注意,修改后需要重啟下rsyslogd。如果是CentOS可使用下列任意一種方式重啟(實際上systemctl新方式,而service實際也是使用systemctl):
| # service rsyslog restart # systemctl restart rsyslog.service |
