logrotate日志不輪轉呢?_新日志size0


程序,要管理log,留作日后的后續功能處理和統計和領導需要。因為懶得寫,所以直接用了syslog函數,把log交給rsyslog去寫了。然后用logrotate每天做日志輪轉。
兩種log分別發送到了local6.info和local6.notice。


#define logInfo(...) pthread_mutex_lock(&logLock);\
logLen=snprintf(logBuf,sizeof(logBuf),__VA_ARGS__);\
syslog(LOG_INFO,logBuf,logLen);\
pthread_mutex_unlock(&logLock)
 
#define logUpload(...) pthread_mutex_lock(&logLock);\
logLen=snprintf(logBuf,sizeof(logBuf),__VA_ARGS__);\
syslog(LOG_NOTICE,logBuf,logLen);\
pthread_mutex_unlock(&logLock)
...
openlog("zhuowang_SS",LOG_PID|LOG_CONS,LOG_LOCAL6);
...
在/etc/rsyslog.conf里添加了
local6.info /var/log/zw_info.log
local6.notice /var/log/zw_notice.log
在/etc/logrotate.d/建新文件zw_log


[root@localhost logrotate.d]# cat zw_log
/var/log/zw_notice.log
/var/log/zw_info.log
{
nocompress
daily
rotate 21
}

意為他倆不壓縮、每天輪轉、保留21份。
但是運行卻發現每天雖然在生成新日志文件,但是日志還是被寫到舊文件里去。好好研究了一下發現這錯誤犯的真2,rsyslog和logrotate根本就是兩個軟件包兩回事嘛。雖然logrotate重命名了當前log,刪了舊log,但是rsyslog不知道哇,打開的文件還是舊文件嘛。當然寫的就是舊文件了嘛。

經探索后發現這個問題有兩種解決辦法。
1.copytruncate,拷貝后截斷。
把當前log拷貝后截斷。可以理解為把內容拷貝走作為備份,然后清空當前文件。但是這有一個問題就是拷貝和截斷之間會有時間差,存在丟數據的可能。
2.給rsyslog發信號。重新打開log文件。
在/etc/logrotate.d/zw_log里添加
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
postrotate表示在日志輪轉后執行
sharedscripts表示zw_notice.log、zw_info.log兩個日志共享這個腳本,就是說他倆輪轉完成后只執行一次這個腳本,默認情況下是每個腳本輪轉完成就執行一次


免責聲明!

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



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