centos 如何用 rsyslog 搭建本地日志服務


一、問題背景

  最近項目遇到一個問題,服務器響應很慢,team中的兩個有經驗的工程師找了一台服務器分析了一下,發現問題出在磁盤寫入過於頻繁。這里大概介紹一下背景,我們的服務器上面主要是跑各種PHP接口,每個接口都有獨立的日志,由於磁盤只有一個磁頭(這顯然誰都知道,ORZ...),而日志又是獨立的,即一次請求過來就需要寫一次日志,由於日志保存的位置不同,也就是一次請求磁頭就需要移動一個位置,機械硬盤大家懂得,這樣顯然就會導致了日志寫入的速度很慢,從而拖慢了服務器的響應時間。

二、解決思路

  顯然問題就出在日志的頻繁寫入上,試想如果能有一個專門的日志服務來接收日志,而不是每次都直接往硬盤中寫入。在此基礎上再加入一些緩存機制,寫日志的問題肯定會好很多。OK,問題的思路有了,但是如何來搭這套服務呢?有沒有一些直接可用的解決方案呢?顯然是有的,畢竟我肯定不是第一個遇到這個問題的人。team中的老司機們說 rsyslog 應該能夠滿足這個要求,而且團隊目前也有在用這個服務,可以了解一下。

三、解決問題的步驟

  1、什么是rsyslog,它能干什么:

  上面說到了 rsyslog 這個工具, rsyslog 是什么呢?簡單說 rsyslog 其實是一個集中日志服務器,它可以支持 tcp、udp或者本地文件等當時的輸入,然后支持把日志寫入到 本地、數據庫等等,如下圖所示:

  http://www.rsyslog.com/common/images/rsyslog-features-imagemap.png

什么?要再具體的說下,請參考官網: http://www.rsyslog.com/ 

  2、如何安裝 rsyslog 

  centos下安裝rsyslog灰常簡單,如你所見:  

	$  yum install rsyslog

   3、配置 rsyslog,官網有配置的向導,鏈接: http://www.rsyslog.com/rsyslog-configuration-builder/,這個做得非常人性化。上面說到 rsyslog 可以支持 TCP、UDP等方式的接收日志,這里不妨先用TCP的方式測試一下,然后把日志寫到本地一個tmp 目錄。生成的配置如下,然后把這個配置放到 /etc/rsyslog.conf 下面。

# 加載tcp模塊
module(load="imtcp")
# tcp方式接收日志,端口號為 514
input(type="imtcp" port="514")
# 接收日志后,寫入到本地/data1/tmp/testlog 中 action(type="omfile" File="/data1/tmp/testlog")

  怎么樣,看上去是不是非常簡潔,是的,就是這么簡單!

  4、啟動rsyslog服務,這一步也灰常簡單,如下:

	$  service rsyslog start 

  然后你可以用 ps 命令看下服務是否啟動了,如下:

	$  ps -aux | grep rsyslog 

  如果看到類似下圖所示的情況,那么服務就起來了:

  5、測試一下服務

  寫一個簡單的php代碼,如下:  

<?php

$errno = '';
$errstr = '';
$fp = stream_socket_client("tcp://xx.xx.xx.xx:514", $errno, $errstr, 30); // 這里需要替換成你的ip地址或者域名
if (!$fp) {
	echo "$errstr ($errno)<br />\n";
} else {
	fwrite($fp, "test message !\n");
	fclose($fp);
}

 然后運行一下這段代碼,可以在 /data1/tmp/testlog (上面指定的接收文件)日志中找到如下一條記錄,那么服務就正式搭好了。

 

今天暫時就寫到這里,未完待續!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM