日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux syslog日志

發布時間:2025/3/15 linux 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux syslog日志 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、syslog協議介紹

?

二、syslog函數

三、Linux?syslog配置

?

一、syslog協議介紹

1、介紹

??? 在Unix類操作系統上,syslog廣泛應用于系統日志。syslog日志消息既可以記錄在本地文件中,也可以通過網絡發送到接收syslog的服務器。接收syslog的服務器可以對多個設備的syslog消息進行統一的存儲,或者解析其中的內容做相應的處理。常見的應用場景是網絡管理工具、安全管理系統、日志審計系統。

??? 完整的syslog日志中包含產生日志的程序模塊(Facility)、嚴重性(Severity或 Level)、時間、主機名或IP、進程名、進程ID和正文。在Unix類操作系統上,能夠按Facility和Severity的組合來決定什么樣的日志消息是否需要記錄,記錄到什么地方,是否需要發送到一個接收syslog的服務器等。由于syslog簡單而靈活的特性,syslog不再僅限于 Unix類主機的日志記錄,任何需要記錄和發送日志的場景,都可能會使用syslog。

??? 長期以來,沒有一個標準來規范syslog的格式,導致syslog的格式是非常隨意的。最壞的情況下,根本就沒有任何格式,導致程序不能對syslog 消息進行解析,只能將它看作是一個字符串。

在2001年定義的RFC3164中,描述了BSD syslog協議:
http://www.ietf.org/rfc/rfc3164.txt
??? 不過這個規范的很多內容都不是強制性的,常常是“建議”或者“約定”,也由于這個規范出的比較晚,很多設備并不遵守或不完全遵守這個規范。接下來就介紹一下這個規范。

??? 約定發送syslog的設備為Device,轉發syslog的設備為Relay,接收syslog的設備為Collector。Relay本身也可以發送自身的syslog給Collector,這個時候它表現為一個Device。Relay也可以只轉發部分接收到的syslog消息,這個時候它同時表現為Relay和Collector。

??? syslog消息發送到Collector的UDP 514端口,不需要接收方應答,RFC3164建議 Device 也使用514作為源端口。規定syslog消息的UDP報文不能超過1024字節,并且全部由可打印的字符組成。完整的syslog消息由3部分組成,分別是PRI、HEADER和MSG。大部分syslog都包含PRI和MSG部分,而HEADER可能沒有。

2、syslog的格式

??? 下面是一個syslog消息:
<30>Oct 9 22:33:20 hlfedora auditd[1787]: The audit daemon is exiting.
??? 其中“<30>”是PRI部分,“Oct 9 22:33:20 hlfedora”是HEADER部分,“auditd[1787]: The audit daemon is exiting.”是MSG部分。

2.1、PRI部分?
??? PRI部分由尖括號包含的一個數字構成,這個數字包含了程序模塊(Facility)、嚴重性(Severity),這個數字是由Facility乘以 8,然后加上Severity得來。不知道他們為什么發明了這么一種不直觀的表示方式。
也就是說這個數字如果換成2進制的話,低位的3個bit表示Severity,剩下的高位的部分右移3位,就是表示Facility的值。
十進制30 = 二進制0001 1110
0001 1... = Facility: DAEMON - system daemons (3)
.... .110 = Severity: INFO - informational (6)

Facility的定義如下,可以看出來syslog的Facility是早期為Unix操作系統定義的,不過它預留了User(1),Local0~7 (16~23)給其他程序使用:

????? Numerical???????????? Facility
???????? Code

????????? 0???????????? kernel messages
????????? 1???????????? user-level messages
????????? 2???????????? mail system
????????? 3???????????? system daemons
????????? 4???????????? security/authorization messages (note 1)
????????? 5???????????? messages generated internally by syslogd
????????? 6???????????? line printer subsystem
????????? 7???????????? network news subsystem
????????? 8???????????? UUCP subsystem
????????? 9???????????? clock daemon (note 2)
???????? 10???????????? security/authorization messages (note 1)
???????? 11???????????? FTP daemon
???????? 12???????????? NTP subsystem
???????? 13???????????? log audit (note 1)
???????? 14???????????? log alert (note 1)
???????? 15???????????? clock daemon (note 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)

?????? Note 1 - Various operating systems have been found to utilize
????????? Facilities 4, 10, 13 and 14 for security/authorization,
????????? audit, and alert messages which seem to be similar.
?????? Note 2 - Various operating systems have been found to utilize
????????? both Facilities 9 and 15 for clock (cron/at) messages.

Severity的定義如下:

?????? 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

??? 也就是說,尖括號中有1~3個數字字符,只有當數字是0的時候,數字才以0開頭,也就是說00和01這樣在前面補0是不允許的。

2.2、HEADER部分?
??? HEADER部分包括兩個字段,時間和主機名(或IP)。
??? 時間緊跟在PRI后面,中間沒有空格,格式必須是“Mmm dd hh:mm:ss”,不包括年份。“日”的數字如果是1~9,前面會補一個空格(也就是月份后面有兩個空格),而“小時”、“分”、“秒”則在前面補“0”。月份取值包括:
Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec

??? 時間后邊跟一個空格,然后是主機名或者IP地址,主機名不得包括域名部分。

??? 因為有些系統需要將日志長期歸檔,而時間字段又不包括年份,所以一些不標準的syslog格式中包含了年份,例如:
<165>Aug 24 05:34:00 CST 1987 mymachine myproc[10]: %% It's
time to make the do-nuts. %% Ingredients: Mix=OK, Jelly=OK #
Devices: Mixer=OK, Jelly_Injector=OK, Frier=OK # Transport:
Conveyer1=OK, Conveyer2=OK # %%
??? 這樣會導致解析程序將“CST”當作主機名,而“1987”開始的部分作為MSG部分。解析程序面對這種問題,可能要做很多容錯處理,或者定制能解析多種syslog格式,而不僅僅是只能解析標準格式。

HEADER部分后面跟一個空格,然后是MSG部分。
??? 有些syslog中沒有HEADER部分。這個時候MSG部分緊跟在PRI后面,中間沒有空格。

2.3、MSG部分?
??? MSG部分又分為兩個部分,TAG和Content。其中TAG部分是可選的。
??? 在前面的例子中(“<30>Oct 9 22:33:20 hlfedora auditd[1787]: The audit daemon is exiting.”),“auditd[1787]”是TAG部分,包含了進程名稱和進程PID。PID可以沒有,這個時候中括號也是沒有的。
??? 進程PID有時甚至不是一個數字,例如“root-1787”,解析程序要做好容錯準備。

??? TAG后面用一個冒號隔開Content部分,這部分的內容是應用程序自定義的。


3、RFC3195?
??? BSD syslog協議使用UDP協議在網絡中傳遞,然而UDP是一個不可靠的協議,并且syslog也沒有要求接收方有所反饋。為了解決這個問題,RFC又定義了一個新的規范來可靠的傳遞syslog消息,它使用TCP協議:
http://www.ietf.org/rfc/rfc3195.txt
??? 不過大多數情況下,使用UDP發送不需要確認的syslog消息,已經能夠滿足要求了,并且這樣做非常簡單。因此到目前為止,RFC3195的應用還是很少見的。

?

?

二、syslog函數

?

linux?C中提供一套系統日記寫入接口,包括三個函數:openlog,syslog和closelog。

調用openlog是可選擇的。如果不調用openlog,則在第一次調用syslog時,自動調用openlog。調用closelog也是可選擇的,它只是關閉被用于與syslog守護進程通信的描述符。

?

#include //頭文件

void openlog (char*ident, int option, int facility);?

void closelog();?

void syslog(int priority, char*format,……);

?

priority參數的格式(severity level|facility code)

示例:

LOG_ERR|LOG_USER

?

severity level:

Priority Level ? ? ? ? ? ? ? Description

LOG_EMERG ? ? ? ? ? ? ? ? ? ?An emergency situation

LOG_ALERT ? ? ? ? ? ? ? ? ? ?High-priority problem, such as database corruption

LOG_CRIT ? ? ? ? ? ? ? ? ? ? Critical error, such as hardware failure

LOG_ERR ? ? ? ? ? ? ? ? ? ? ?Errors

LOG_WARNING ? ? ? ? ? ? ? ? ?Warning

LOG_NOTICE ? ? ? ? ? ? ? ? ? Special conditions requiring attention

LOG_INFO ? ? ? ? ? ? ? ? ? ? Informational messages

LOG_DEBUG ? ? ? ? ? ? ? ? ? ?Debug messages?

?

facility value(轉自syslog.h頭文件):

?

#define LOG_KERN ? ? ? ?(0<<3) ?

#define LOG_USER ? ? ? ?(1<<3) ?

#define LOG_MAIL ? ? ? ?(2<<3) ?

#define LOG_DAEMON ? ? ?(3<<3) ?

#define LOG_AUTH ? ? ? ?(4<<3) ?

#define LOG_SYSLOG ? ? ?(5<<3) ?

#define LOG_LPR ? ? ? ? (6<<3) ?

#define LOG_NEWS ? ? ? ?(7<<3) ?

#define LOG_UUCP ? ? ? ?(8<<3) ?

#define LOG_CRON ? ? ? ?(9<<3) ?

#define LOG_AUTHPRIV ? ?(10<<3)

#define LOG_FTP ? ? ? ? (11<<3)

三、linux syslog配置

1)、syslog日志服務:

1、守護進程:syslog

2、端口:514

3、配置文件:/etc/syslog.conf

4、常見日志文件:

/var/log/dmesg ? ? ?內核引導信息日志

/var/log/message ? ?標準系統錯誤信息日志

/var/log/maillog ? ?郵件系統信息日志

/var/log/cron ? ? ? 計劃任務日志

/var/log/secure ? ? 安全信息日志

2)、 配置文件:

syslog配置文件如下

-----------------------------------------------------------------

[root@server ~]# vim /etc/syslog.conf

# Log all kernel messages to the console.

# Logging much else clutters up the screen.

#kern.* ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /dev/console

# Log anything (except mail) of level info or higher.

# Don't log private authentication messages!

*.info;mail.none;authpriv.none;cron.none ? ? ? ? ? ? ? ?/var/log/messages

# The authpriv file has restricted access.

authpriv.* ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/var/log/secure

# Log all the mail messages in one place.

mail.* ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?-/var/log/maillog

# Log cron stuff

cron.* ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/var/log/cron

# Everybody gets emergency messages

*.emerg ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *

# Save news errors of level crit and higher in a special file.

uucp,news.crit ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/var/log/spooler

# Save boot messages also to boot.log

local7.* ? ??

-----------------------------------------------------------------

配置文件中每行表示一個項目,格式為:facility.level ? ?action

由兩個部分組成:

第一部分:選擇條件(可以有一個或者多個條件),分為兩個字段。

第二部分:操作動作;

? ? 1、選擇條件

? ? 選擇條件本身分為兩個字段,之間用一個小數點(.)分隔。前一字段是一項服務,后一字段是一個優先級。選擇條件是對消息類型的一種分類,這種分類便于人們把不同類型的消息發送到不同的地方。在同一個syslog配置行上允許出現一個以上的選擇條件,但必須用分號(;)隔開。

? ? 常見facility:

kern ? ? ? ? ? ? ? ?內核信息;

user ? ? ? ? ? ? ? ?用戶進程信息;

mail ? ? ? ? ? ? ? ?電子郵件相關信息;

daemon ? ? ? ? ?后臺進程相關信息;

authpriv ? ? ? ? ? ?包括特權信息如用戶名在內的認證活動;

cron ? ? ? ? ? ? ? ?計劃任務信息;

syslog ? ? ? ? ?系統日志信息

lpr ? ? ? ? ? ? 打印服務相關信息。

news ? ? ? ? ? ?新聞組服務器信息

uucp ? ? ? ? ? ? ? ?uucp 生成的信息

local0----local7 ? ? ? ?本地用戶信息

? ? 2、重要級:

重要級是選擇條件的第二個字段,它代表消息的緊急程度。

按嚴重程度由低到高排序:

debug ? ? ? 不包含函數條件或問題的其他信息

info ? ? ? ? ? ?提供信息的消息

none ? ? ? ?沒有重要級,通常用于排錯

notice ? ? ?具有重要性的普通條件

warning ? ? 預警信息

err ? ? ? ? 阻止工具或某些子系統部分功能實現的錯誤條件

crit ? ? ? ? ? ?阻止某些工具或子系統功能實現的錯誤條件

alert ? ? ? ? ? 需要立即被修改的條件

emerg ? ? ? 該系統不可用

? ? 不同的服務類型有不同的優先級,數值較大的優先級涵蓋數值較小的優先級。如果某個選擇條件只給出了一個優先級而沒有使用任何優先級限定符,對應于這個優先級的消息以及所有更緊急的消息類型都將包括在內。比如說,如果某個選擇條件里的優先級是“warning”,它實際上將把“warning”、 “err”、“crit”、“alert”和“emerg”都包括在內。

? ? 3、操作動作

日志信息可以分別記錄到多個文件里,還可以發送到命名管道、其他程序甚至另一臺機器。

syslog 主要支持以下活動:

file ? ? ? ? ? ? ? ? ? ?指定文件的絕對路徑

terminal 或 prin ? ? ? ?完全的串行或并行設備標志符

@host(@IP地址) ? ?遠程的日志服務器

?

3)、 搭建Linux日志服務器:

1、編輯/etc/sysconfig/syslog文件,讓服務器能夠接受客戶端傳來的數據:

在“SYSLOGD_OPTIONS”行上加“-r”選項以允許接受外來日志消息。

-----------------------------------------------------------------

[root@client ~]# vim /etc/sysconfig/syslog

# Options to syslogd

# -m 0 disables 'MARK' messages.

# -r enables logging from remote machines

# -x disables DNS lookups on messages recieved with -r

# See syslogd(8) for more details

SYSLOGD_OPTIONS="-r -m 0"

# Options to klogd

# -2 prints all kernel oops messages twice; once for klogd to decode, and

# ? ?once for processing with 'ksymoops'

# -x disables all klogd processing of oops messages entirely

# See klogd(8) for more details

KLOGD_OPTIONS="-x"

#

SYSLOG_UMASK=077

# set this to a umask value to use for all log files as in umask(1).

# By default, all permissions are removed for "group" and "other".

-----------------------------------------------------------------

?2、重新啟動syslog守護進程。?

-----------------------------------------------------------------

[root@client ~]# service syslog restart

關閉內核日志記錄器: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [確定]

關閉系統日志記錄器: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [確定]

啟動系統日志記錄器: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [確定]

啟動內核日志記錄器: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [確定]

[root@client ~]#

-----------------------------------------------------------------

?3、關閉iptables,也可以開啟514端口。本例中我們關閉iptables。

? ? ? ? ? 四、配置各客戶端:

? ? ? ? ?1、配置/etc/syslog.conf

? ? ? ? ?修改客戶機/etc/syslog.conf文件,在有關配置行的操作動作部分用一個“@”字符指向日志服務器

-----------------------------------------------------------------

[root@client ~]# vim /etc/syslog.conf

# Log all kernel messages to the console.

# Logging much else clutters up the screen.

#kern.* ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /dev/console

*.* ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @10.64.165.210

# The authpriv file has restricted access.

authpriv.* ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/var/log/secure

……下面省略

-----------------------------------------------------------------

?另外如果配置了DNS域名的話可以使用域名。

? ? ? ? ? 2、重啟客戶端syslog使設置生效。

檢測成果:

? ? ? ? 下圖是我們在客戶端重啟iptables服務后在服務端看到的日志情況:

-----------------------------------------------------------------

[root@client ~]# cat /var/log/messages |tail

Nov 30 16:44:29 10.64.165.200 kernel: klogd 1.4.1, log source = /proc/kmsg started.

Nov 30 16:44:33 10.64.165.200 kernel: Removing netfilter NETLINK layer.

Nov 30 16:44:33 10.64.165.200 kernel: ip_tables: (C) 2000-2006 Netfilter Core Team

Nov 30 16:44:33 10.64.165.200 kernel: Netfilter messages via NETLINK v0.30.

Nov 30 16:44:33 10.64.165.200 kernel: ip_conntrack version 2.4 (4096 buckets, 32768 max) - 228 bytes per conntrack


————————————————————————————————————————————————————————————————

Linux日記系統由系統日志監控程序syslogd和內核日志監控程序klogd組成。從它們的命名可以看到,這兩個監控程序都是守護程序(daemon),且都注冊成了系統服務。換句話說,我們可以在目錄/etc/init.d/下找到它們對應的執行程序,并通過service命令對它們進行啟動,關閉,重啟等操作。/etc/syslog.conf文件是Linux日記系統的配置文件。下面是本人/etc/syslog.conf文件內容(ubuntu下為/etc/rsyslog.conf)

?

?

  • #?Log?all?kernel?messages?to?the?console.??
  • #?Logging?much?else?clutters?up?the?screen.??
  • #kern.*?????????????????????????????????????????????????/dev/console??
  • ?
  • #?Log?anything?(except?mail)?of?level?info?or?higher.??
  • #?Don't?log?private?authentication?messages!???
  • *.info;mail.none;authpriv.none;cron.none????????????????/var/log/messages??
  • ?
  • #?The?authpriv?file?has?restricted?access.???
  • authpriv.*??????????????????????????????????????????????/var/log/secure??
  • ?
  • #?Log?all?the?mail?messages?in?one?place.???
  • mail.*??????????????????????????????????????????????????-/var/log/maillog??
  • ?
  • ?
  • #?Log?cron?stuff???
  • cron.*??????????????????????????????????????????????????/var/log/cron??
  • ?
  • #?Everybody?gets?emergency?messages???
  • *.emerg?????????????????????????????????????????????????*??
  • ?
  • #?Save?news?errors?of?level?crit?and?higher?in?a?special?file.???
  • uucp,news.crit??????????????????????????????????????????/var/log/spooler??
  • ?
  • #?Save?boot?messages?also?to?boot.log???
  • local7.*????????????????????????????????????????????????/var/log/boot.log??
  • ?

    在對這個配置文件進行詳細的解釋之前,我們先看一下在Linux C編程中如何利用syslog進行日記。

    syslog APIs

    Linux C中提供一套系統日記寫入接口,包括三個函數:openlog,syslog和closelog。

    調用openlog是可選擇的。如果不調用openlog,則在第一次調用syslog時,自動調用openlog。調用closelog也是可選擇的,它只是關閉被用于與syslog守護進程通信的描述符。

    下面是這三個函數的調用格式:

    ?

    其中openlog和closelog都是可選的。不過,通過調用openlog,我們www.linuxidc.com可以指定ident參數。這樣,ident將被加到每條日記記錄中。ident一般設成程序的名字,如在下面例子中的"testsyslog":

  • #include?<syslog.h>???
  • ??
  • int?main(int?argc,?char?*argv[]) ??
  • { ??
  • ????openlog("testsyslog",?LOG_CONS?|?LOG_PID,?0); ??
  • ????syslog(LOG_USER?|?LOG_INFO,?"syslog?test?message?generated?in?program?%s?\n",?argv[0]); ??
  • ????closelog(); ??
  • ????return?0; ??
  • }??
  • ?

    編譯生成可執行文件后,每運行一次,程序將往/var/log/messages添加一條如下的記錄:

  • Apr?23?17:15:15?lirong-920181?testsyslog[27214]:?syslog?test?message?generated?in?program?./a.out??
  • ?

    格式基本是:timestamp hostname ident[pid]:log message。其中ident就是我們調用openlog是指定的"testsyslog",而之所以會打印出[27214]是openlog的option參數中指定了LOG_PID。下面我們詳細討論openlog函數中的option,facility和syslog函數中的priority參數。

    根據/usr/include/sys/syslog.h文件,我們可以看到syslog支持的option如下:

  • /*??
  • ?*?Option?flags?for?openlog.??
  • ?*??
  • ?*?LOG_ODELAY?no?longer?does?anything.??
  • ?*?LOG_NDELAY?is?the?inverse?of?what?it?used?to?be.??
  • ?*/?
  • #define?LOG_PID?????0x01????/*?log?the?pid?with?each?message?*/??
  • #define?LOG_CONS????????????0x02????/*?log?on?the?console?if?errors?in?sending?*/??
  • #define?LOG_ODELAY??0x04????/*?delay?open?until?first?syslog()?(default)?*/??
  • #define?LOG_NDELAY??0x08????/*?don't?delay?open?*/??
  • #define?LOG_NOWAIT??0x10????/*?don't?wait?for?console?forks:?DEPRECATED?*/??
  • #define?LOG_PERROR??0x20????/*?log?to?stderr?as?well?*/??
  • 我們可以通過與操作結合這些option。syslog支持的faclility如下:

  • /*?facility?codes?*/?
  • #define?LOG_KERN????????????(0<<3)????/*?kernel?messages?*/??
  • #define?LOG_USER????????????(1<<3)????/*?random?user-level?messages?*/??
  • #define?LOG_MAIL????????????(2<<3)????/*?mail?system?*/??
  • #define?LOG_DAEMON??(3<<3)????/*?system?daemons?*/??
  • #define?LOG_AUTH????????????(4<<3)????/*?security/authorization?messages?*/??
  • #define?LOG_SYSLOG??(5<<3)????/*?messages?generated?internally?by?syslogd?*/??
  • #define?LOG_LPR?????(6<<3)????/*?line?printer?subsystem?*/??
  • #define?LOG_NEWS????????????(7<<3)????/*?network?news?subsystem?*/??
  • #define?LOG_UUCP????????????(8<<3)????/*?UUCP?subsystem?*/??
  • #define?LOG_CRON????????????(9<<3)????/*?clock?daemon?*/??
  • #define?LOG_AUTHPRIV????(10<<3)???/*?security/authorization?messages?(private)?*/??
  • #define?LOG_FTP?????(11<<3)???/*?ftp?daemon?*/??
  • facility的ID(上面對應的數值)與名字的對應關系如下:

  • {?"auth",?LOG_AUTH?}, ??
  • {?"authpriv",?LOG_AUTHPRIV?}, ??
  • {?"cron",?LOG_CRON?}, ??
  • {?"daemon",?LOG_DAEMON?}, ??
  • {?"ftp",?LOG_FTP?}, ??
  • {?"kern",?LOG_KERN?}, ??
  • {?"lpr",?LOG_LPR?}, ??
  • {?"mail",?LOG_MAIL?}, ??
  • {?"mark",?INTERNAL_MARK?},??????/*?INTERNAL?*/??
  • {?"news",?LOG_NEWS?}, ??
  • {?"security",?LOG_AUTH?},???????/*?DEPRECATED?*/??
  • {?"syslog",?LOG_SYSLOG?}, ??
  • {?"user",?LOG_USER?}, ??
  • {?"uucp",?LOG_UUCP?},??
  • 這個對應關系作用是是將syslog系統調用中facility ID和syslog.conf文件中的配置選項對應起來。后面將詳細講解。facility的作用是指明調用syslog應用的類型。syslog支持的priority如下:

  • #define?LOG_EMERG???0???/*?system?is?unusable?*/??
  • #define?LOG_ALERT???1???/*?action?must?be?taken?immediately?*/??
  • #define?LOG_CRIT????????????2???/*?critical?conditions?*/??
  • #define?LOG_ERR?????3???/*?error?conditions?*/??
  • #define?LOG_WARNING?4???/*?warning?conditions?*/??
  • #define?LOG_NOTICE??5???/*?normal?but?significant?condition?*/??
  • #define?LOG_INFO????????????6???/*?informational?*/??
  • #define?LOG_DEBUG???7???/*?debug-level?messages?*/??
  • priority的ID(上面對應的數值)與名字的對應關系如下:

  • {?"alert",?LOG_ALERT?}, ??
  • {?"crit",?LOG_CRIT?}, ??
  • {?"debug",?LOG_DEBUG?}, ??
  • {?"emerg",?LOG_EMERG?}, ??
  • {?"err",?LOG_ERR?}, ??
  • {?"error",?LOG_ERR?},???????/*?DEPRECATED?*/??
  • {?"info",?LOG_INFO?}, ??
  • {?"none",?INTERNAL_NOPRI?},?????/*?INTERNAL?*/??
  • {?"notice",?LOG_NOTICE?}, ??
  • {?"panic",?LOG_EMERG?},?????/*?DEPRECATED?*/??
  • {?"warn",?LOG_WARNING?},????????/*?DEPRECATED?*/??
  • {?"warning",?LOG_WARNING?},??
  • 這個對應關系的作用和facility情況是相同的,都是為了與syslog.conf文件中的配置選項對應起來。priority的作用是指明日記記錄的優先級,也可以理解成記錄時間的嚴重程度。在實際使用中,syslog函數中的priority參數實際上是前面提到的facility和priority的組合,通過與操作。

    回到前面提到的syslog.conf文件和testsyslog的程序,根據前面的分析,我們來研究一下為什么testsyslog會將日記記錄寫到文件/var/log/messages中,而不是別的文件。

    syslog.conf文件行的基本語法是這樣的:

    [消息類型(規則)]???? [處理方案(日記文件)]

    這里需要注意的是,兩者之間必須用一個或者多個Tab字符分開。消息類型是由”消息來源“(facility)和”緊急程度“(priority)構成,中間點號連接。如前面syslog.conf文件中的news.crit表示來自news的”關鍵“狀況。這里,news表示消息來源,crit表示關鍵狀況。通配符*表示一切消息來源,如第一條規則:*.info,將info級以上(notice,warning, err, alert, emerg)(priority表)的所有消息發送到日記文件/var/log/messages。而testsyslog程序中,調用syslog函數時指定的priority是LOG_USER | LOG_INFO,根據上面提到的ID和名字對應的關系,對應的消息類型規則是user.info,包含在規則*.info中,所以日記記錄會寫到/var/log/messages。

    修改syslog.conf文件

    一般來說,我們希望能夠為自己的應用程序指定特定的日記文件。這時候,我們就需要修改syslog.conf文件。假設我們現在要把調試(debug)日記記錄寫到文件/var/log/debug文件中。第一步要做的是,在syslog.conf文件添加如下消息規則作為第一條規則:

  • user.debug??????????????????/var/log/debug??
  • 要是添加的新規則生效,第二步我們需要重啟syslogd和klogd:service syslog restart(ubuntu下為/etc/init.d/rsyslog restart)

    為了測試新規則是否生效,我們可以將testsyslog修改如下:

  • #include?<syslog.h>???
  • ??
  • int?main(int?argc,?char?*argv[]) ??
  • { ??
  • ????openlog("testsyslog",?LOG_CONS?|?LOG_PID,?0); ??
  • ????syslog(LOG_USER?|?LOG_DEBUG,?"syslog?test?message?generated?in?program?%s?\n",?argv[0]); ??
  • ????closelog(); ??
  • ????return?0; ??
  • }??
  • 編譯生成執行文件后,每運行一次,/var/log/debug文件都會增加一條新的記錄


  • 總結

    以上是生活随笔為你收集整理的linux syslog日志的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。