功能目標需求:記錄應用的日誌到指定的目錄文件
開發:
1.配置:
rsyslog配置增加自定義的日誌路徑,rsyslog的配置文件爲rsyslog.conf,一般在/etc目錄下,vi打開後增加配置
local2.* /root/logs/log1.log
local3.* /root/logs/log2.log
log1.log,log2.log爲自定義日誌名字。
配置更新後,重啓rsyslog
service rsyslog restart
2.程序調用接口:
相關接口
void openlog( char *ident, int option, int facility)
void syslog( int priority, char *format, ...)
void closelog( void )
頭文件:
#include <syslog.h>
openlog()函數有三個參數:
第一個參數是標誌字符串,也就是日誌中的第5個字段(前4個字段分別是月、日、時:分:秒、主機名),不設的話缺省取程序名稱;
第二個參數是選項,是下面一些標誌位的組合,如(LOG_PID | LOG_CONS):
option參數
LOG_PID // 在日誌信息中包含進程標識符,這是系統分配給每個進程的一個唯一值
LOG_CONS // 如果信息不能被記錄到日誌文件中,就把它們發送到控制檯
LOG_ODELAY // 在第一次調用syslog時纔打開日誌功能
LOG_NDELAY // 立即打開日誌功能,而不是等到第一次記錄日誌時
第三個參數是說明日誌類型的:
LOG_AUTH
LOG_AUTHPRIV
LOG_CRON
LOG_DAEMON
LOG_KERN
LOG_LOCAL0 - LOG_LOCAL7 (編程中用戶自定義)
LOG_LPR
LOG_MAIL
LOG_NEWS
LOG_SYSLOG
LOG_USER(default)
LOG_UUCP
syslog()函數主要的是第一個參數priority,後面那些參數就是和printf( )函數用法一樣了,priority值表示該條日誌的級別,日誌級別分8級,由高到低的順序爲:
LOG_EMERG // 緊急情況
LOG_ALERT // 高優先級故障,例如數據庫崩潰
LOG_CRIT // 嚴重錯誤,例如硬件故障
LOG_ERR // 錯誤
LOG_WARNING // 警告
LOG_NOTICE // 需要注意的特殊情況
LOG_INFO // 一般信息
LOG_DEBUG // 調試信息
根據系統配 置,LOG_EMERG信息可能會廣播給所有用戶,LOG_ALERT信息可能會EMAIL給管理員,LOG_DEBUG信息可能會被忽略,而其他信息則 寫入日誌文件。當我們編寫的程序需要使用日誌記錄功能時,只要在希望創建一條日誌信息時簡單的調用syslog函數即可。如果openlog( )時沒有指定facility,是可以把facility的值或到priority中的,如(LOG_AUTH | LOG_INFO),已經設置了就可以不用或了。
關閉日誌記錄。
void closelog( void )
示例代碼如下
#include <syslog.h>
int main()
{
string str = "test log";
openlog("ExeName", LOG_CONS | LOG_PID, 0);
syslog(LOG_ERR | LOG_LOCAL3, str.c_str());
syslog(LOG_ERR | LOG_LOCAL2, str.c_str());
closelog();
return 0;
}
3.命令行調用
logger -p local2.info ‘this is test log ‘