1. 程式人生 > >Linux日誌系統分析:rsyslog、syslog和klog

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       –核心崩潰等嚴重資訊