Linux日志系统分析:rsyslog、syslog和klog
ubuntu版本:ubuntu-gnome-16.04-desktop-amd64,gnome版
---------------------------------------------------------------------------------
?
1. syslogd和rsyslogd
syslogd是Linux下的一個記錄日志文件服務(wù)。從結(jié)構(gòu)來說,可以理解為這個服務(wù)下面有一系列的子服務(wù),例如mail、auth、cron、kern等等,這些子服務(wù)對外提供日志記錄的功能,而當其它的程序或服務(wù)需要記錄日志的時候,就可以直接調(diào)用這些子服務(wù)將日志記錄到設(shè)定的地方。而配置這整個守護進程以及其子服務(wù)的地方就是/etc/syslog.conf這個文件。
而目前不少的Linux發(fā)行版已經(jīng)用rsyslogd將syslogd代替了。rsyslogd是syslogd的升級版,其配置語法與syslogd的配置文件一致。ubuntu-gnome-16.04使用的是rsyslogd。
注:
在用戶空間有專門用于記錄系統(tǒng)日志的程序,統(tǒng)稱為“syslog守護進程”。早期及現(xiàn)在的大部分嵌入式系統(tǒng)使用的是klogd+syslogd組合,現(xiàn)在大多數(shù)發(fā)行版都使用rsyslogd或者syslogd-ng。
如果需要修改系統(tǒng)日志配置,修改以下兩個文件。
1)/etc/rsyslog.conf
2)/etc/rsyslog.d/50-default.conf 日志文件的記錄規(guī)則和路徑
操作:
sudo service rsyslog restart
sudo service rsyslog stop
sudo service rsyslog start
?
2. 查看linux日志的三種途徑:
1)dmesg
printk()打印的日志會寫到kernel ring buffer(環(huán)緩沖區(qū))中,dmesg是從kernel ring buffer中讀取內(nèi)核日志信息。
2)/var/log/
系統(tǒng)所有日志(包括用戶日志和系統(tǒng)內(nèi)核日志)均記錄在/var/log/目錄下。
rsyslogd守護進程根據(jù)/etc/rsyslog.conf和/etc/rsyslog.d/50-default.conf,將不同的服務(wù)產(chǎn)生的log記錄到不同的文件中。
3)/proc/kmsg
通過讀取/proc/kmsg也可以得到ring buffer(環(huán)緩沖區(qū))的日志,但是對/proc/kmsg進行讀操作后,ring buffer中被讀取的數(shù)據(jù)將被清空。
注:如果啟用了rsyslogd服務(wù),則不能讀取/proc/kmsg 文件(文件為空),同一時間只能用一種方法來獲取日志文件。
?
3. 日志記錄的接口:
1)內(nèi)核空間:printk()
可以使用dmesg命令來查看,使用printk()打印的日志同時也會記錄在/var/log/kern.log和/var/log/syslog。當然也可以關(guān)閉rsyslogd服務(wù),通過讀取/proc/kmsg來查看。
2)用戶空間:syslog()函數(shù)和logger(logger可在命令行中直接執(zhí)行)
void syslog(int priority, char*format,……);
打印的日志記錄在 /var/log/syslog文件中。
注:據(jù)自己理解,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
注:試了執(zhí)行service rsyslog restart 但是無法使規(guī)則生效。
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)); //設(shè)置屏蔽低于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/*
結(jié)果如下:
/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? ?? ? –有調(diào)式信息的,日志信息最多
1 info? ?? ?? –一般信息的日志,最常用
2 notice? ?? ?–最具有重要性的普通條件的信息
3 warning? ???–警告級別
4 err? ?? ?? ?–錯誤級別,阻止某個功能或者模塊不能正常工作的信息
5 crit? ?? ???–嚴重級別,阻止整個系統(tǒng)或者整個軟件不能正常工作的信息
6 alert? ?? ? –需要立刻修改的信息
7 emerg? ?? ? –內(nèi)核崩潰等嚴重信息
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Linux日志系统分析:rsyslog、syslog和klog的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用DNS实现SQL注入带外查询(OOB
- 下一篇: 微信公众号之自定义菜单