Linux日志系統分析:rsyslog、syslog和klog


參考博客:

 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 傳來的所有內核信息。
syslog日志運行邏輯

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.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM