參考博客: https://blog.csdn.net/lidonghat/article/details/55004280 https://blog.csdn.net/u012247418/article/details/83684052 1.syslog是 Unix 系統的一個常見組件,用於執行 ...
參考博客:
https://blog.csdn.net/lidonghat/article/details/55004280
https://blog.csdn.net/u012247418/article/details/83684052
1.syslog是 Unix 系統的一個常見組件,用於執行系統日誌記錄活動。
2.syslogd 是它的守護進程,syslogd 從一組日誌源(如 /dev/log 和 /dev/klog )中讀取數據,並按照 /etc/syslog.conf 中的說明處理這些日誌消息。通過調用syslog(),可將應用程式日誌消息記錄到 syslog 中。syslog 消息採用一種包含可選優先順序和設備的標準格式。優先順序指示消息的緊急程度,設備指示發佈消息的子系統。/usr/include/syslog.h中定義了它的優先順序和設備資源。
3.klog是一個從Unix內核接受消息的設備,klogd 守護進程獲得並記錄 Linux 內核信息。通常,syslogd 會記錄 klogd 傳來的所有內核信息。
kernel---> 物理終端(/dev/console) --> /var/log/message 命令dmesg 就是控制台輸出/var/log/message日誌信息
/sbin/init
/var/log/message: 系統標準錯誤日誌信息;非內核產生引導信息,各子系統產生的信息;
/var/log/maillog: 郵件系統產生的日誌信息;
/var/log/secure: 系統登錄日誌信息
----------------------
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中讀取內核日誌信息;效果等同於cat /var/log/message
2)/var/log/
系統所有日誌(包括用戶日誌和系統內核日誌)均記錄在/var/log/目錄下。
rsyslogd守護進程根據/etc/rsyslog.conf和/etc/rsyslog.d/XXXXX.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均可
-----------------------------
解讀文件:/etc/syslog.conf或者rsyslog.conf
配置文件定義格式為:facility.priority action
facility ,可以理解為日誌的來源或設備目前常用的
auth # 認證相關的
authpriv #許可權,授權相關的
cron #任務計劃相關的
daemon #守護進程相關的
kern #內核相關的
lpr #列印相關的
mail #郵件相關的
mark #標記相關的
news #新聞相關的
security #安全相關的,與auth類似
user #用戶相關的
uucp #unix to unix cp 相關的
local0-local7 #用戶自定義
* # *表示所有類型
priority (log level) 日誌級別從低到高
debug #程式或者系統調試信息
info #一般信息
notice #不影響正常功能,需要註意的信息
warning/warn #可能影響系統功能,需要提醒用戶的重要事件
err/error #錯誤信息
crit # 比較嚴重的
alert #必須馬上處理的,警告
emerg/oanic # 會導致系統不可用的
* # 所有日誌級別
none # 跟 * 相反表示什麼都沒有
action (動作) 日誌記錄位置
系統上的絕對路徑 #普通文件 如:/var/log/xxxx
| # 管道,發送給其他命令處理,數據進一步加工
終端 # 終端 如 /dev/console
@HOST # 遠程主機 如:@192.168.101.122 也可以後面更上該機器的對應路徑 , @192.168.101.122:/var/log/xxxxx
用戶 # 系統用戶,發送給此用戶處理,按照此用戶的日誌來記錄
* #登錄到系統上的所有用戶,一般emerg級別日誌就是這樣處理的
三種方式:unix域套接字、udp埠514以及特殊的設備/dev/klog
大多數出現調用syslog向/dev/log這個套接字發送日記消息。
Device:發送syslog的設備
Relay:轉發syslog的設備(Relay可能只是轉發部分接收到的syslog消息,它同時表現為Relay和Collector)
Collector:接收syslog的設備
syslog消息的udp報文不能超過1024位元組。
完整的syslog日誌中包含日記的程式模塊(Facility)、嚴重性(Severity | Level)、時間、主機名或ip、進程名、進程id和正文
完整的syslog消息由3部分組成,分別是PRI、HEADER和MSG(<30>Oct 9 22:33:20 hlfedora auditd[1787]: The audit daemon is exiting.),PRI:<30>。HEADER:Oct9...hlfedora。
PRI部分是由程式模塊(Facility)<<3 | 嚴重性(Severity)組成:換句話說 Facility可以有32種,Severity可以有8種。
Numerical Facility #日誌類型
Code
0 kernel messages #內核信息
1 user-level messages #用戶級別信息
2 mail system #郵件系統
3 system daemons #系統信息
4 security/authorization messages (note 1) #安全認證信息(標註1)
5 messages generated internally by syslogd #由syslogd內部生成的消息
6 line printer subsystem #行式印表機子系統
7 network news subsystem #網路信息子系統
8 UUCP subsystem #UUCP子系統
9 clock daemon (note 2) #時鐘守護進程(標註2)
10 security/authorization messages (note 1) #安全認證信息(標註2)
11 FTP daemon #FTP守護進程
12 NTP subsystem #NTP時鐘同步子系統
13 log audit (note 1) #日誌認證(標註1)
14 log alert (note 1) #日誌告警(標註1)
15 clock daemon (note 2) #時鐘守護進程(標註2)
16 local use 0 (local0) #用戶自定義日誌來源標簽
17 local use 1 (local1)
18 local use 2 (local2)
19 local use 3 (local3)
20 local use 4 (local4)
21 local use 5 (local5)
22 local use 6 (local6)
23 local use 7 (local7)
Numerical Severity #日誌級別
Code
0 Emergency: system is unusable
1 Alert: action must be taken immediately
2 Critical: critical conditions
3 Error: error conditions
4 Warning: warning conditions
5 Notice: normal but significant condition
6 Informational: informational messages
7 Debug: debug-level messages
HEADER部分包括兩個欄位:時間和主機名
MSG部分分為兩個部分:TAG和Content;TAG包含程式名稱和進程PID,TAG後面用一個冒號隔開Content部分
RFC3195:用tcp代替udp,進行可靠的syslog消息
//將info或更高級別的消息送到/var/log/messages,除了mail以外。
//其中*是通配符,代表任何設備;none表示不對任何級別的信息進行記錄。
*.info;mail.none;authpriv.none /var/log/messages
//將authpirv設備的任何級別的信息記錄到/var/log/secure文件中,這主要是一些和認、許可權使用相關的信息。
authpriv.* /var/log/secure
//將mail設備中的任何級別的信息記錄到/var/log/maillog文件中,這主要是和電子郵件相關的信息。
mail.* /var/log/maillog
//將cron設備中的任何級別的信息記錄到/var/log/cron文件中,這主要是和系統中定期執行的任務相關的信息。
cron.* /var/log/cron
//將任何設備的emerg級別的信息發送給所有正在系統上的用戶。
*.emerg *
//將uucp和news設備的crit級別的信息記錄到/var/log/spooler文件中。
uucp,news.crit /var/log/spooler
//將和系統啟動相關的信息記錄到/var/log/boot.log文件中。
local7.* /var/log/boot.log
---------------------------------------
基本語法格式
類型.級別[;類型.級別] 動作
news.=crit /var/log/news.crit
‘=’特殊符號,如果存在說明只有本Severity的消息才進行處理,如果不存在則處理本Severity及其以下級別的消息
‘;'表示&&、'!'表示取反、’*'表示所有
1 # Log all kernel messages to the console. 2 # Logging much else clutters up the screen. 3 #kern.* /dev/console 4 5 # Log anything (except mail) of level info or higher. 6 # Don't log private authentication messages! 7 *.info;mail.none;authpriv.none;cron.none /var/log/messages 8 9 # The authpriv file has restricted access. 10 authpriv.* /var/log/secure 11 12 # Log all the mail messages in one place. 13 mail.* -/var/log/maillog ## '-'分號代表是非同步寫入,非實時寫入 14 15 16 # Log cron stuff 17 cron.* /var/log/cron 18 19 # Everybody gets emergency messages 20 *.emerg * 21 22 # Save news errors of level crit and higher in a special file. 23 uucp,news.crit /var/log/spooler 24 25 # Save boot messages also to boot.log 26 local7.* /var/log/boot.log
動作:表示信息發送的目的地
可以是日記文件(絕對路徑),如果文件名前面加上減號表示不將日誌信息同步刷新到磁碟上(使用寫入緩存),這樣可以提高日誌寫入性能,但是增加了系統崩潰後丟失日誌的風險
可以是遠程主機(@host,host可以是ip或功能變數名稱,預設在/etc/hosts文件下loghost這個別名已經指定給本機)
可以是指定用戶(user1,user2),如果指定用戶已登入,那麼他們將收到消息
客戶端有兩種方式開發:
完全基於協議從底層開發,也就是直接寫unix域套接字或者向UDP514發送定製消息
基於庫函數供上層應用使用
==================================================================================================
註意:
一般隨著時間的推移系統日誌會越來越大,占用磁碟空間,增加記憶體和磁碟消耗,所以引出了進程logroate來進行日誌按照自動一大小分割和保留規定時間日誌,滾動覆蓋歷史日誌
logrotate:日誌文件會隨著日誌的增加而不斷增大,從而帶來效率的問題和空間使用問題,在常年運行的伺服器上面,通常會有logrotate程式定期進行日誌文件的輪替和刪除工作。
配置文件/etc/logroate.conf 來定義不同的功能日誌配置信息,裡面可以定義日誌的存儲時間周期,日誌分割文件大小,個數等;統一都放在/etc/logroate.d/目錄下
# see "man logrotate" for details # rotate log files weekly weekly #周期 # keep 4 weeks worth of backlogs rotate 4 #文件個數 # create new (empty) log files after rotating old ones create #新文件創造動作 # uncomment this if you want your log files compressed #compress # RPM packages drop log rotation information into this directory include /etc/logrotate.d #存放目錄 # no packages own wtmp -- we'll rotate them here /var/log/wtmp { #這裡定義每個不同功能日誌時,除了上面的預設屬性,
#如果自身未定義優先去查找自身定義的,如果沒有才會用預設定義的,優先使用自身定義的 monthly minsize 1M #最小大小 create 0664 root utmp #以默寫用戶創建,給予文件許可權 rotate 1 } /var/log/btmp { missingok monthly minsize 1M create 0600 root utmp rotate 1 } # system-specific logs may be also be configured here.