使用Linux自帶日志滾動工具logrotate滾動redis日志示例


截至到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的源代碼,可發現每次寫日志均是先fopenfprintf,實現十分簡單,毫無日志滾動邏輯:

// 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.confinclude所有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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM