Linux日誌系統分析:rsyslog、syslog和klog
ubuntu版本:ubuntu-gnome-16.04-desktop-amd64,gnome版
---------------------------------------------------------------------------------
1. syslogd和rsyslogd
syslogd是Linux下的一個記錄日誌檔案服務。從結構來說,可以理解為這個服務下面有一系列的子服務,例如mail、auth、cron、kern等等,這些子服務對外提供日誌記錄的功能,而當其它的程式或服務需要記錄日誌的時候,就可以直接呼叫這些子服務將日誌記錄到設定的地方。而配置這整個守護程序以及其子服務的地方就是/etc/syslog.conf這個檔案。
而目前不少的Linux發行版已經用rsyslogd將syslogd代替了。rsyslogd是syslogd的升級版,其配置語法與syslogd的配置檔案一致。ubuntu-gnome-16.04使用的是rsyslogd。
注:
在使用者空間有專門用於記錄系統日誌的程式,統稱為“syslog守護程序”。早期及現在的大部分嵌入式系統使用的是klogd+syslogd組合,現在大多數發行版都使用rsyslogd或者syslogd-ng。
如果需要修改系統日誌配置,修改以下兩個檔案。
1)/etc/rsyslog.conf
2)/etc/rsyslog.d/50-default.conf 日誌檔案的記錄規則和路徑
操作:
sudo service rsyslog restart
sudo service rsyslog stop
sudo service rsyslog start
2. 檢視linux日誌的三種途徑:
1)dmesg
printk()列印的日誌會寫到kernel ring buffer(環緩衝區)中,dmesg是從kernel ring buffer中讀取核心日誌資訊。
2)/var/log/
系統所有日誌(包括使用者日誌和系統核心日誌)均記錄在/var/log/目錄下。
rsyslogd守護程序根據/etc/rsyslog.conf和/etc/rsyslog.d/50-default.conf,將不同的服務產生的log記錄到不同的檔案中。
3)/proc/kmsg
通過讀取/proc/kmsg也可以得到ring buffer(環緩衝區)的日誌,但是對/proc/kmsg進行讀操作後,ring buffer中被讀取的資料將被清空。
注:如果啟用了rsyslogd服務,則不能讀取/proc/kmsg 檔案(檔案為空),同一時間只能用一種方法來獲取日誌檔案。
3. 日誌記錄的介面:
1)核心空間:printk()
可以使用dmesg命令來檢視,使用printk()列印的日誌同時也會記錄在/var/log/kern.log和/var/log/syslog。當然也可以關閉rsyslogd服務,通過讀取/proc/kmsg來檢視。
2)使用者空間:syslog()函式和logger(logger可在命令列中直接執行)
void syslog(int priority, char*format,……);
列印的日誌記錄在 /var/log/syslog檔案中。
注:據自己理解,syslog()列印的日誌不會寫到kernel ring buffer,只有printk才會寫入kernel ring buffer。
4. 自定義日誌記錄路徑
4.1 修改/etc/rsyslog.d/50-default.conf
在檔案最後新增如下一行:
local0.* /var/log/my_logfile0
注:local0—local7均可。
4.2 重啟Ubuntu
注:試了執行service rsyslog restart 但是無法使規則生效。
4.3 編寫程式碼測試
#include <syslog.h>
int main(int argc, char *argv[])
{
openlog("test_my_log", LOG_CONS| LOG_PID, LOG_LOCAL0);
setlogmask(LOG_UPTO(LOG_NOTICE)); //設定遮蔽低於NOTICE級別的日誌資訊
syslog(LOG_INFO, "log info %s\n", argv[0]);
syslog(LOG_ERR, "log err %s\n", argv[0]);
syslog(LOG_WARNING, "log warning %s\n", argv[0]);
closelog();
return 0;
}
1)gcc log.c
2)./a.out
3)grep test_my_log /var/log/*
結果如下:
/var/log/my_logfile0:Apr 12 20:30:49 ubuntu test_my_log[2456]: log err ./a.out
/var/log/my_logfile0:Apr 12 20:30:49 ubuntu test_my_log[2456]: log warning ./a.out
/var/log/syslog:Apr 12 20:30:49 ubuntu test_my_log[2456]: log err ./a.out
/var/log/syslog:Apr 12 20:30:49 ubuntu test_my_log[2456]: log warning ./a.out
可知log資訊被記錄到my_logfile0,同時也被記錄到syslog。
注:
0 debug –有調式資訊的,日誌資訊最多
1 info –一般資訊的日誌,最常用
2 notice –最具有重要性的普通條件的資訊
3 warning –警告級別
4 err –錯誤級別,阻止某個功能或者模組不能正常工作的資訊
5 crit –嚴重級別,阻止整個系統或者整個軟體不能正常工作的資訊
6 alert –需要立刻修改的資訊
7 emerg –核心崩潰等嚴重資訊