syslog相關內容介紹
簡介:
syslog server 從網絡設備接收系統日志消息,並實時顯示它們。
系統日志消息可以使用以下事件進行處理:
1、在滾動窗口中顯示消息
2、將消息記錄到文本文件
3、將消息轉發到另一個系統日志服務器
4、記錄到ODBC數據庫
5、記錄到NT應用程序事件日志
6、通過SMTP將消息通過電子郵件發送給某人
7、運行外部程序,如尋呼通知系統
8、發送SNMP陷阱消息
系統syslog內容的相關介紹
安裝源碼包,既不影響系統里面運行的syslog,也由於二者容易沖突,所以選擇源碼安裝
版本:rsyslog-7.4.10
1、安裝依賴包,參考官方文檔
yum install git valgrind autoconf automake flex bison python-docutils python-sphinx json-c-devel libuuid-devel libgcrypt-devel zlib-devel openssl-devel libcurl-devel gnutls-devel mysql-devel postgresql-devel libdbi-dbd-mysql libdbi-devel net-snmp-devel
yum install autogen libtool
export PKG_CONFIG_PATH=/lib64/pkgconfig/ #設置環境變量
yum install libestr-devel -y
yum install liblogging-devel-1.0.4-2.gf.el6.x86_64.rpm liblogging-1.0.4-2.gf.el6.x86_64.rpm
2、./autogen.sh
運行這個來生成所有的初始makefiles等,運行這個腳本之后就會有configure這個工具了
接下來可以使用./congure --enable...添加各種插件功能,插件目錄在/rsyslog-7.4.10/plugins/下,使用-h查看支持的選項
make && make install
3、配置相應的功能之后就啟動服務了
/usr/local/rsyslog/sbin/rsyslogd --help #查看相應的服務啟動參數
配置和相關文檔的說明
man8手冊的說明:http://man7.org/linux/man-pages/man8/rsyslogd.8.html
OPTIONS
-D 配置解析器在調試模式下運行,通常在很難發現配置錯誤的情況下使用
-d 在debug模式下運行
-f 指定配置文件運行,默認在/etc/rsyslog.conf
-i 指定pid文件運行,如果是多實例的話,需要指定不同的pid文件
-n 默認是由init進程進行守護運行
-N level 以檢查配置文件的方式運行,默認是0級別
rsyslogd -f ../sample.conf -N 1 -i /var/run/rsyslogd1.pid
-C 改變root目錄的方式運行
-v 打印版本信息
SIGNALS
Rsyslogd接受一些信號的響應
示例:kill -SIGNAL $(cat /var/run/rsyslogd.pid)
將SIGNAL替換成相應的信號值
HUP 讓rsyslogd執行關閉所有打開的文件。
TERM,INT,QUIT 停止rsyslog的運行
USR1 當rsyslog運行在debug的時候有用,可以用來切換狀態
CHLD 略
security threats
rsyslogd守護進程可能被用作拒絕服務攻擊的管道,且在本機開啟UDP端口容易導致機器風險。
1、使用防火牆來限制哪些機器可以訪問514端口
2、將保存的信息存放在非根文件系統的位置,確保不會損害當前的機器。
3、以非root用戶運行
FILES
/etc/rsyslog.conf 配置rsyslogd運行的配置文件
/dev/log Unix域套接字讀取本地syslog消息
/var/run/rsyslogd.pid rsyslogd運行的pid文件
prefix/lib/rsyslog rsyslogd rsyslogd 目錄,默認編譯的路徑
man5關於rsyslog配置文件的詳細說明
http://man7.org/linux/man-pages/man5/rsyslog.conf.5.html#top_of_page
MODULES
im開頭的輸入模塊,om開頭的輸出模塊
ommysql 輸出到mysql的模塊
imfile 文本文件輸入模塊
imudp udp輸入模塊
imtcp tcp輸入模塊
imrelp RELP協議輸入插件
...
BASIC STRUCTURE
Global directives
全局指令用來設置rsyslog的運行全局屬性,譬如message的隊列尺寸等。
Templates
Templates 可以將message處理成指定的格式,必須在rules之前被定義好。
Output channels
為用戶可能需要的任何類型的輸出提供了..
Rules(selector + action)
每一個rules都包含了這兩個字段,這兩個字段由一個或多個空格或制表符分隔。
selector字段指定屬於指定動作的facilities和priorities的模式。
SELECTORS
facility和priority由點號分隔,不區分大小寫。
facility由以下幾個關鍵字組成:
auth, authpriv, cron, daemon, kern, lpr, mail, mark, news, security等
你可以通過這些關鍵字來重定向這些消息。
priority由以下幾個關鍵字組成:
debug, info, notice, warning, warn, err, crit, alert, emerg, panic等
可以用來定義消息的優先級
1、* 表示所有facility或priority
2、可以在相同的priority指定多個facility,使用,來分隔。
3、多個selectors可以指定單個action,通過;號分隔,選擇器字段中的每個選擇器都可以覆蓋前面的選擇器。
4、擴展語法,=指定單一的priority,!表示忽略所有priorities。
ACTIONS
作為一個規則表示如何處理消息,一般會是寫入文本文件或數據庫等操作。
Regular file
*.* /var/log/traditionalfile.log;RSYSLOG_TraditionalFileFormat
#以指定的格式寫入指定的文件
Named pipes
支持將輸出記錄到命名管道(fifos),通過將管道符號'|'預先添加到文件的名稱,可以將fifo或命名管道用作日志消息的目的地。
fifo必須在rsyslogd啟動之前使用mkfifo命令創建。
一邊寫一邊讀,類似python中的queue,會阻塞。
Terminal and console
可以將輸出重定向到終端,/dev/console
Remote machine
輸出到遠程主機上,@表示udp,@@表示tcp,如果采用RELP協議,需要在遠程主機前加上:omrelp:。
*.* @192.168.0.1
#將消息發送到192.168.0.1的514端口(默認端口)
action(type="omfwd" Target="192.168.0.1" Device="eth0" Port=514 Protocol="udp")
#通過omfwd可以指定更多屬性
*.* :omrelp:192.168.0.1:2514
#使用RELP協議,需要先加載模塊后才可以使用
List of users
通常會將一些嚴重的信息通知給系統用戶
:omusrmsg:root,user1,user2
Everyone logged on
一些緊急的消息需要發送給所有用戶,這時候可以使用*來表示
:omusrmsg:*
Database table
利用相應的輸出模塊將message信息輸出到數據庫中
Discard
將不需要的消息進行丟棄
*.* stop #stop表示丟棄動作,也可以使用~來表示
Output channel
將輸出通道定義綁定到此操作,必須以$開頭,支持模板定義。
Shell execute
略
FILTER CONDITIONS
提供3種條件過濾的類型
1、基於selectors的severity和facility
2、基於property
3、基於expression(表達式)
Selectors是傳統的過濾方式syslog的消息。
保持了傳統的語法, 如果只需要根據facility和priority進行篩選,則應該使用Selectors進行篩選。
Property-Based Filters
允許過濾任何屬性,例如HOSTNAME, syslogtag and msg等
必須以:開頭,后面接屬性名,一個逗號,一個比較操作符,另一個逗號,然后是比較的值,這個值必須被引用。
示例:
:property, [!]compare-operation, "value"
以下是compare-operation操作的支持情況:
contains: 檢查值中包含的字符串是否包含在屬性中
isequal: 比較提供的"值"字符串和屬性內容。 這兩個值必須完全相等。
startswith:檢查值是否剛好在屬性值的起始處找到。
regex: 將該屬性與提供的正則表達式進行比較。
Expression-Based Filters
參考官方文檔
TEMPLATES
每一個rsyslog的輸出都是用templates,適用於文件,用戶信息等。
如果你不指定一個templates的話,默認會使用一個預置的模板,被硬編碼在代碼之中。
template由一個template指令,一個名稱,實際模板文本和可選的選項
$template MyTemplateName,"\7Text %property% some more text\n",<options>
$template TraditionalFormat,"%timegenerated% %HOSTNAME% %syslogtag%%msg%\n"
\斜杠是轉義,\7是一個ASCII字符,除了百分號以外的東西,模板中的所有文本都是字面使用的。
%%里面是屬性值,可以訪問消息的內容,通過property replacer去訪問。
templates可以用來生成selector行的動態文件名。
$template DynFile,"/var/log/system-%HOSTNAME%.log"
Template options
請務必不要將模板選項與屬性選項相混淆-后者由property replacer處理,僅應用於單一屬性而不是整個模板。
sql:格式化適合於MySQL格式的SQL語句的字符串,這將在每個字段內用單引號"'"和反斜線字符"'"和"\"替換反斜線字符。
stdsql:提供標准的sql語句格式
如果你將信息寫入數據庫中,一定要注意sql注入的問題。
Template examples
模板不能實際上被分割成多行。
一個傳統的模板輸出:
$template TraditionalFormat,"%timegenerated% %HOSTNAME%%syslogtag%%msg:::drop-last-lf%\n"
復雜一點的模板
$template precise,"%syslogpriority%,%syslogfacility%,%timegenerated%,%HOSTNAME%,%syslogtag%,%msg%\n"
RFC 3164 format的模板
$template RFC3164fmt,"<%PRI%>%TIMESTAMP% %HOSTNAME% %syslogtag%%msg%"
傳統的模板格式用於用戶信息
$template usermsg," XXXX%syslogtag%%msg%\n\r"
OUTPUT CHANNELS
$outchannel name,file-name,max-size,action-on-max-size
$outchannel name表示outchannel名稱
file-name表示寫入文件名
max-size表示寫入最大的尺寸
action-on-max-size在達到最大尺寸的時候執行的動作,這個命令總是只有一個參數。
*.* :omfile:$mychannel
PROPERTY REPLACER
property replacer是rsyslog輸出系統的核心組成部分,一個message有很多properties,通過property replacer訪問。
Accessing Properties
系統日志消息屬性在模板中使用,通過百分比標志之間的訪問,屬性可以由屬性替換器修改。完整的語法如下:
%propname:fromChar:toChar:options% #propname為訪問屬性名
Available Properties
msg message的MSG部分
rawmsg 從socket接受的消息,一般用於debug
HOSTNAME message中的hostname
FROMHOST 接收到message的主機來源
syslogtag message的TAG部分
programname tag的static部分,當TAG is "named[12345]", programname is "named".
PRI message的PRI部分-未解碼(單一值)
PRI-text message的PRI部分,以文本的形式
IUT 略
syslogfacility message的facility,以數字的形式
syslogfacility-text message的facility,以文本的形式
syslogseverity message的severity,以數字的形式
syslogseverity-text message的severity,以文本的形式
timegenerated message被接收到時候的時間戳
timereported message里面的timestamp
TIMESTAMP timereported的別名
PROTOCOL-VERSION 略
STRUCTURED-DATA 略
APP-NAME 略
PROCID 略
MSGID MSGID的內容
$NOW 當前的日期格式,YYYY-MM-DD
$YEAR The current year (4-digit)
$MONTH The current month (2-digit)
$DAY The current day of the month (2-digit)
$HOUR The current hour in military (24 hour) time (2-digit)
$MINUTE The current minute (2-digit)
這些不是源於消息,而是內部生成的。
Character Positions
FromChar and toChar被用於建立子串,指定的字符串被拷貝出來。
"%msg:1:2%" #提取前兩個字符
"%msg:::lowercase%" #所有字符串轉換成小寫
%msg:10:$% #提取第十到結尾的字符
正則的支持
"%msg:R:.*Sev:. \(.*\) \[.*--end%" #使用正則需要R開頭
基於字段
"%msg:F:3%"
"%msg:F,59:3%" #F指定分隔符
Property Options
uppercase 將屬性轉換為小寫
lowercase 屬性的文本轉換為大寫
drop-last-lf 刪除message結尾的LF
date-mysql mysql的時間格式
date-rfc3164 RFC 3164時間格式
date-rfc3339 RFC 3339時間格式
escape-cc 替換控制字符
space-cc 替換控制字符為空格
drop-cc 結果字符串將不包含控制字符,轉義序列或空間的任何其他替換字符。
操作系統版本syslog的使用情況
rpm -ql rsyslog-5.8.10-8.el6.x86_64
/etc/logrotate.d/syslog #用於logrotate的配置
/etc/pki/rsyslog
/etc/rc.d/init.d/rsyslog #rsyslog的服務管理腳本
/etc/rsyslog.conf #主配置文件
/etc/rsyslog.d #配置文件包含目錄
/etc/sysconfig/rsyslog #rsyslogd選項
/lib64/rsyslog #庫文件目錄
/sbin/rsyslogd #運行的二進制文件
/usr/share/doc/rsyslog-5.8.10 #幫助文檔
/etc/rsyslog.conf配置內容簡介:
$ModLoad imuxsock #本地系統日志的輸入支持(e.g. via logger command)
$ModLoad imklog #提供內核日志輸入支持
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat #默認模板
$IncludeConfig /etc/rsyslog.d/*.conf #配置文件包含目錄
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
...
將各種日志的各種級別進行輸出重定向到文件
/etc/logrotate.d/syslog
利用syslog將系統各種信息輸出到指定的各個文件之后,再利用logrotate去對日志進行滾動壓縮等操作
示例:
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
#在進行日志滾動的時候需要發送HUP信號給syslogd進程,關閉打開的所有文件
endscript
}
logrotate
可以基於日志的大小或時間進行滾動,支持壓縮,拷貝等眾多功能。
rpm -ql logrotate-3.7.8-17.el6.x86_64
/etc/cron.daily/logrotate #由cron定時任務管理器來啟動logrotate
/etc/logrotate.conf #logrotate主配置文件
/etc/logrotate.d #logrotate配置文件目錄
/usr/sbin/logrotate #logrotate運行的二進制文件
/usr/share/doc/logrotate-3.7.8 #關於logrotate的文檔信息
/etc/logrotate.conf配置文件簡介:
compress #全局指定,日志進行壓縮處理。
"/var/log/httpd/access.log" /var/log/httpd/error.log {
rotate 5 #輪轉5個日志,之前的會被移除
mail recipient@example.org #發送郵件信息
size 100k #按照大小進行輪轉
sharedscripts # 如果指定了sharedscripts,那么腳本只運行一次,因為在多個日志進行輪轉的時候只需要執行一次重載服務即可。
postrotate
/usr/bin/killall -HUP httpd
endscript #在postrotate和endcript之間的內容,在日志文件輪轉后執行(使用/bin/sh)。
}
cron定時任務
logrotate由cron進行定時觸發執行,而logrotate作為syslog的工具對日志進行滾動,syslog進行日志分類收集存儲。
rpm -ql crontabs-1.10-33.el6.noarch
/etc/cron.daily
/etc/cron.hourly
/etc/cron.monthly
/etc/cron.weekly
/etc/crontab
/usr/bin/run-parts
/usr/share/man/man4/crontabs.4.gz
rpm -ql cronie-1.4.4-15.el6_7.1.x86_64
/etc/cron.d
/etc/cron.d/0hourly
/etc/cron.deny
/etc/pam.d/crond
/etc/rc.d/init.d/crond
/etc/sysconfig/crond
/usr/bin/crontab
/usr/sbin/crond
Cron在crontab文件中搜索/var/spool/cron,這些文件以/etc/passwd中的帳戶命名; 找到的crontabs被加載到內存中。
Cron還會搜索/etc/anacrontab和/etc/cron.d目錄中具有不同格式的任何文件(請參閱crontab(5))。
使用modtime選項時,Cron會每分鍾檢查一次crontables的modtimes以檢查是否有任何更改,並重新加載已更改的crontables。
Cron檢查的目錄如下:
/etc/crontab #系統的crontab,現在文件默認是空的。通過讀取/etc/anacrontab配置文件的anacron運行。
/etc/cron.d/ #包含為不同用戶存儲的系統cron job的目錄。
/var/spool/cron #包含由crontab命令創建的用戶crontables的目錄。
