Ubuntu 設置 log 級別

Linux環境下使用rsyslog管理日誌

 
 

在 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 , 它指定了模板的功能,支持選項爲sqlstdsql,在使用數據庫存儲的時候會用到。

生成動態文件名

模板能夠用來生成動態文件名,就如以前所述,在使用動態文件名的時候,須要在 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 接收到一個消息的時候,首先傳遞消息預處理器,而後加入到主消息隊列,接下來消息會從隊列中取出傳遞給規則處理器。

Message Flow in 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函數的時候,指定了 indentLogHeader, 同時在日誌中加入進程的 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

相關文章
相關標籤/搜索