在 Linux 系統中,日誌文件記錄了系統中包括內核、服務和其它應用程序等在內的運行信息。
在咱們解決問題的時候,日誌是很是有用的,它能夠幫助咱們快速的定位遇到的問題。php
在 Cent OS 6中,日誌是使用rsyslogd
守護進程進行管理的,該進程是以前版本的系統中syslogd
的升級版,對原有的日誌系統進行了功能的擴展,提供了諸如過濾器,日誌加密保護,各類配置選項,輸入輸出模塊,支持經過 TCP 或者 UDP 協議進行傳輸等。css
rsyslog
的配置文件爲 /etc/rsyslog.conf , 大多很多天志文件都位於 /var/log/ 目錄中。html
定位日誌文件
大多很多天志文件都位於 /var/log/ 目錄中。在該目錄中,你可能注意到不少日誌文件末尾包含一串數字(如 maillog-20150301 ),這說明這些日誌文件通過了日誌轉儲,這樣能夠避免日誌文件過大。linux
在軟件包
logrotate
中包含了一個定時任務,根據/etc/logrotate.conf
文件和/etc/logrotate.d/
目錄中的的配置按期的轉儲日誌文件。nginx
Rsyslog基本配置
Rsyslog 的主要配置文件爲 /etc/rsyslog.conf 文件,在配置文件中,咱們經過配置 filter 以及 action 對日誌進行管理。正則表達式
在rsyslog
配置文件中,使用以下格式定義規則sql
filter action
rsyslog
發現符合 filter 規則的日誌後,會將日誌發送到 action 指定的動做進行處理。typescript
Filter
在rsyslog
中,提供了三種方式的過濾器方法:數據庫
基於設施/優先級的過濾器 (Facility/Priority-based filters)
基於設施/優先級的過濾器是最經常使用的方法,語法以下:segmentfault
FACILITY.PRIORITY
FACILITY
指定了產生日誌消息的子系統,可選值爲 auth , authpriv , cron , daemon , kern , lpr , mail , news , syslog , user , ftp , uucp , local0 ~ local7 。
PRIORITY
指定了日誌消息的優先級,可用的優先級包含 debug (7) , info (6) , notice (5) , warning (4) , err (3) , crit (2) , alert (1) , emerg (0) 。
前置符號
=
代表只有該優先級的消息會被捕獲,!
代表除了該優先級的消息以外的優先級會被捕獲。除了前置符號外,可使用符號*
表示全部的設施或者優先級,對優先級部分使用none
關鍵字會捕獲全部沒有指定優先級的消息。
定義多個設施或者優先級使用,
分隔,若是是多個 filter 的話,則使用;
進行分隔。
使用範例
kern.* # 選擇全部優先級的內核日誌 mail.crit # 選擇全部mail 的優先級高於crit的日誌 cron.!info,!debug # 選擇除了 info 和 debug 優先級的 cron 日誌
基於屬性的過濾器
基於屬性的過濾器語法
:PROPERTY, [!]COMPARE_OPERATION, "STRING"
:PROPERTY
是要比較的日誌屬性,COMPARE_OPERATION
爲要執行的比較操做,這個的!
表示取反的意思,"STRING"
爲比較的值。
可使用的比較操做:
比較操做 | 描述 |
---|---|
contains | 匹配提供的字符串值是不是屬性的一部分,若是不區分大小寫,使用contains_i |
isequal | 比較屬性和值是否相等 |
startswith | 屬性是否以指定字符串開始(startswith_i ) |
regex | 正則表達式(POSIX BRE 基本正則)匹配 |
ereregex | 正則表達式(POSIX ERE 擴展正則)匹配 |
isempty | 判斷屬性是否爲空,不須要 value |
使用範例:
:msg, contains, "error" :hostname, isequal, "host1" :msg, !regex, "fatal .* error"
基於表達式的過濾器
基於表達式的過濾器使用了rsyslog
自定義的腳本語言RainerScript構建複雜的filter,這裏暫時不對這種方法進行講述。
Action
Action定義了當匹配指定的 filter 的時候,執行什麼操做。
若是要指定多個 ACTION, 使用
&
鏈接多個 ACTION。
例如:kern.=crit user1 & ^test-program;temp & @192.168.0.1
這裏的
;temp
指定了傳遞日誌給 test-program 程序時( ^ 開頭代表日誌發送給該可執行文件),使用它 temp 模板格式化日誌。
在 ACTION 後面追加;模板名稱
能夠爲指定的 action 使用該模板格式化日誌。
保存日誌到日誌文件
語法:
FILTER PATH
這裏的 PATH 指定了日誌要保存到的文件。例如 cron.* /var/log/cron.log
指定了全部的定時任務日誌都寫入到/var/log/cron.log
文件。
默認狀況下,每次生成 syslog 的時候,日誌信息會同步到日誌文件。能夠在文件路徑前使用 - 指定忽略同步(若是系統崩潰,會丟失日誌,可是這樣能夠提升日誌性能)。
除了上述方法記錄日誌(靜態),也能夠動態的生成日誌文件。
FILTER ?DynamicFile
這裏的DynamicFile
是預約義的輸出路徑模板。
經過網絡發送syslog
rsyslog
可使用網絡將日誌消息發送或者接受日誌,使用這個特性,能夠實現使用單一的日誌服務器統一管理多臺服務器日誌。
@[(zNUMBER)]HOST:[PORT]
這裏的@
告訴syslog
使用 UDP 協議發送日誌,要使用 TCP 的話,使用 @@
。可選值zNUMBER
設置了是否容許使用zlib
對日誌壓縮(壓縮級別1-9)。
使用範例
*.* @192.168.0.1 # 使用 UDP 發送,默認端口514 *.* @@example.com:18 # 使用 TCP 發送到端口18, 默認10514 *.* @(z9)[2001:db8::1] # UDP, ipv6,使用zlib級別9壓縮
丟棄日誌
要丟棄日誌消息,使用~
動做。
FILTER ~
例如:
cron.* ~
模板
任何rsyslog
生成的日誌均可以根據須要使用模板進行格式化,要建立模板,使用以下指令
$template TEMPLATE_NAME,"text %PROPERTY% more text", [OPTION]
這裏的$template
指令代表了接下來的內容定義了一個模板,TEMPLATE_NAME
是模板的名稱,接下來雙引號之間的內容爲模板的內容。
這裏還有一個 OPTION , 它指定了模板的功能,支持選項爲
sql
和stdsql
,在使用數據庫存儲的時候會用到。
生成動態文件名
模板能夠用來生成動態文件名,就如以前所述,在使用動態文件名的時候,須要在 ACTION 中的模板名稱前增長?
代表該文件名是動態生成的。
例如:
$template DynamicFile,"/var/log/test_logs/%timegenerated%-test.log" *.* ?DynamicFile
timegenerated
屬性從日誌信息中提取出消息的時間戳,這樣能夠爲每一個日誌生成惟一文件名稱。
屬性
在模板中使用的屬性是在%
之間的內容,使用屬性能夠訪問日誌消息中的內容。
%PROPERTY_NAME[:FROM_CHAR:TO_CHAR:OPTION]%
可用的屬性列表見man rsyslog.conf
。
全局指令
全局指令是rsyslogd
守護進程的配置指令。全部的全局指令必須以$
開始,每行只能有一個指令,例如:
$MainMsgQueueSize 50000
在新的配置格式中(rsyslog v6),已經不在使用這種方式的指令,可是它們仍然是可用的。
隊列
在 rsyslog 中,隊列用來傳輸數據,當 rsyslog 接收到一個消息的時候,首先傳遞消息預處理器,而後加入到主消息隊列,接下來消息會從隊列中取出傳遞給規則處理器。
規則處理器是一個解析過濾引擎,它會基於配置文件中定義的規則,執行相應的動做(action),每個動做都有本身的動做隊列,消息經過這個隊列發送到對應的動做處理器,而後輸出。
對於同一個消息來講,能夠同時傳遞這個消息給多個動做隊列。
定義隊列
在配置文件/etc/rsyslog.conf
文件中
$objectQueueType queue_type
這裏的隊列類型可選值爲 direct , linkedlist , fixedarray (內存隊列), 或者 disk 。
默認狀況下,對於主隊列,使用的是FixedArray隊列(10000個消息長度),動做隊列採用的是direct 隊列。
PHP 使用 syslog 輸出日誌
在PHP 中,調用系統日誌系統的函數有三個
bool openlog ( string $ident , int $option , int $facility ) bool syslog ( int $priority , string $message ) bool closelog ( void )
函數openlog
用於打開到系統日誌系統的鏈接,第一個參數$ident
是一個字符串,syslog 會將該字符串自動加到使用syslog
函數輸出的全部日誌消息的前面。第二個參數是日誌選項,第三個參數是記錄日誌的設施。
函數
openlog()
和closelog()
是可選的。
例如,咱們在/etc/rsyslog.conf
配置文件中增長以下配置
local5.* /tmp/php_test.log
增長後須要重啓 rsyslog 進程(sudo /etc/init.d/rsyslog restart
)
在 PHP 腳本中,執行以下操做
<?php openlog("LogHeader", LOG_PID, LOG_LOCAL5); syslog(LOG_DEBUG, "Hello, Logger");
執行上述腳本,咱們能夠在/tmp
目錄中看到出現名爲php_test.log
的文件
Mar 10 14:47:04 vm-hp LogHeader[8261]: Hello, Logger
第一部分Mar 10 14:47:04
爲日誌時間,第二部分vm-hp
爲主機的 HOSTNAME , 咱們在 調用openlog
函數的時候,指定了 indent
爲LogHeader
, 同時在日誌中加入進程的 PID(LOG_PID)。
上述日誌消息,若是要使用模板的話,是下面這樣的
$template LOG_TMP,"%timegenerated% %HOSTNAME% %msg%" local5.* /tmp/php_test.log;LOG_TMP
咱們將全部支持的模板屬性變量輸出以下
msg: Hello, Logger, rawmsg: <175>Mar 10 15:52:49 LogHeader[13845]: Hello, Logger, HOSTNAME: vm-28-234-pro01-hp, FROMHOST: vm-28-234-pro01-hp, syslogtag: LogHeader[13845]:, programname: LogHeader, PRI: 175, PRI-text: local5.debug, IUT: 1, syslogfacility: 21, syslogfacility-text: local5, syslogseverity: 7, syslogseverity-text: debug, timereported: Mar 10 15:52:49, TIMESTAMP: Mar 10 15:52:49, timegenerated: Mar 10 15:52:49, PROTOCOL-VERSION: 0, STRUCTURED-DATA: -, APP-NAME: LogHeader, PROCID: 13845, MSGID: -
參考: Red Hat Enterprise linux 6 Deployment Guide: Chapter 23. Viewing and Managing Log Files