在CentOS7中,Rsyslong是一個集中式的日志收集系統,可以運行在TCP或者UDP的514端口上。
目錄
開始之前
配置接收日志的主機
配置發送日志的主機
日志回滾
附件:創建日志接收模板
排錯
開始之前
本文的配置環境如下
系統:CentOS7
主機數量:2
接收日志的主機ip:192.168.1.112;主機名:server112
發送日志的主機ip:192.168.1.204;主機名:server204
rsyslog版本號:rsyslog-7.4.7-7.el7_0.x86_64
目的:把server204上產生的所有日志信息和所有的操作命令都發送到server112主機上,以便集中監控和分析日志
如果你的主機名在安裝系統時沒有修改,默認為localhost.domain,如果不修改主機名,那么所有的日志集中在一個服務器上時就會互相覆蓋。
查看當前的主機名:hostname
修改主機名流程:
在文件/etc/hostname中添加新的主機名
在文件/etc/hosts的第一行的兩個地方添加新的主機名
注意:一定要在localhost.domain的前面添加{主機名}.domain,否則不能在/var/log目錄下產生以主機名命名的目錄
github項目:https://github.com/Kylinlin/logsystem
在該項目下的scripts目錄下有兩個文件,configure_rsyslog_for_client.sh是用來配置發送日志的客戶端腳本,configure_rsyslog_for_server.sh是用來配置接收日志的服務器端腳本。往后會在該項目中添加日志分析系統和更為全面的日志管理方法。
聲明:本文大量引用了Linux.cn開源中文社區的一篇博客內容:https://linux.cn/article-5023-1.html
配置接收日志的主機
查看你的系統上是否安裝了rsyslog系統
rpm -qa | grep rsyslog
在主機上安裝rsyslog
yum install rsyslog* -y
安裝完成后,打開文件/etc/rsyslog.conf進行配置,主要是把下面的注釋去掉,並添加三行字符
$template RemoteLogs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log" * *.* ?RemoteLogs & ~
如下圖所示:
在此對該模板進行簡單解釋,$template RemoteLogs(這里“RemoteLogs” 字符串可以為任何其他的描述性的名稱)指令使rsyslog后台進程將日志消息寫到/var/log下的單獨的本地日志文件中,其中日志文件的名稱是基於遠程日志發送機器的主機名以及生成該日志的應用程序名進行定義的。其中第二行暗示了我們將RemoteLogs模板應用到所有接收到的日志上。
符號"& ~"表示了一個重定向規則,被用來告知rsyslog守護進程停止對日志消息的進一步處理,並且不要在本地寫入。如果沒有使用該重定向規則,那么所有的遠程消息都會在寫入上述描述的日志文件之外同時被寫入到本地日志文件,這就意味着日志消息實際上被寫了兩次。使用該規則的另外一個結果就是syslog服務器本身的日志消息只會被以該機器主機名命名的專有文件中
如果想配置特定的模板,參考本文最后的附件
rsyslog進程的控制命令為
查看進程運行情況(Status) :systemctl status rsyslog
停止(Stop) :systemctl stop rsyslog
重啟(Restart) :systemctl restart rsyslog
啟動(Start) :systemctl start rsyslog
查看514端口是否啟動 :netstat -antup | grep 514
配置發送日志的主機
如果沒有安裝rsyslog,則安裝
yum install rsyslog -y
安裝完成后,同樣配置/etc/rsyslog.conf文件,在文件的最后一行添加如下字符
*.* @192.168.1.112:514
如果用的是TCP協議,則要多加一個@:*.* @@192.168.1.112:514
把該主機上的所有操作命令同時發送到日志主機去,打開配置文件/etc/bashrc
在文件的最后一行添加以下內容:
export PROMPT_COMMAND='{ msg=$(history 1 | { read x y; echo $y; });logger "[euid=$(whoami)]":$(who am i):[`pwd`]"$msg"; }'
重新加載bash配置文件:
source /etc/bashrc
打開防火牆的514端口
firewall-cmd --add-port=514/udp --permanent firewall-cmd --add-port=514/tcp --permanent firewall-cmd --reload
重啟rsyslog
systemctl restart rsyslog
至此,基本配置完成
日志回滾
在接收日志的主機上,進入目錄/var/log,可以看到生成了兩個文件夾server112和server204(根據兩台主機名生成的),在server204文件夾中的一個名為root.log文件就是該主機上執行過的所有命令,其他文件都是根據進程名生成的。
設置日志回滾,編輯文件/etc/logrotate.d/syslog
把記錄日志的兩個路徑添加進去,記得把server112和server204替換為你的主機名
這樣就能自動回滾這兩個目錄下的所有日志
附件:創建日志接收模板
可以使用下面的模式對特定的設備或嚴重性級別使用新的模板直接來記錄日志消息。
[facility-level].[severity-level] ?RemoteLogs
serverity-level table(服務級別列表)
serverity-level table(服務級別列表) |
||
數字代碼 |
服務級別 |
描述 |
0 |
emerg |
系統不可用 |
1 |
alert |
必須馬上采取救援行動 |
2 |
crit |
嚴重錯誤信息 |
3 |
error |
錯誤信息 |
4 |
warning |
警告信息 |
5 |
notice |
普通但是值得注意的信息 |
6 |
info |
一般信息 |
7 |
debug |
調試信息 |
facility-level table(設備級別列表),如下圖
例如:
將全部優先級別的所有內部用戶驗證消息指定為RemoteLogs模板:
authpriv.* ?RemoteLogs
將所有系統進程中除開mail、用戶驗證和cron消息之外的進程產生的消息級別的日志指定為RemoteLogs模板:
*.info,mail.none,authpriv.none,cron.none ?RemoteLogs
如果我們想要將所有從遠程客戶端接受到的消息寫入到一個以它們的IP地址命名的單個文件中,可以使用以下的模板。在此我們為該模板賦予了“IpTemplate”名稱。
$template IpTemplate,"/var/log/%FROMHOST-IP%.log" *.* ?IpTemplate & ~
排錯
上面的配置很簡單,但是有時候服務端就是很詭異地接收不到客戶端發送的日志(在服務端的/var/log目錄下沒有以客戶端主機名命名的文件夾),此時就要逐一檢查以下問題:
1.檢查配置文件是否有錯
2.兩台機器之間是否能ping通
3.查看服務端是否已經在監控514端口:netstat -lnutp
4.注意服務端監控的514端口究竟是udp還是tcp協議,而客戶端也必須使用一致的協議