程序,要管理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兩個日志共享這個腳本,就是說他倆輪轉完成后只執行一次這個腳本,默認情況下是每個腳本輪轉完成就執行一次
