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 (上面指定的接收文件)日志中找到如下一条记录,那么服务就正式搭好了。

 

今天暂时就写到这里,未完待续!

 

posted @ 2016-07-16 18:22  talk_is_cheap  阅读(5646)  评论(0编辑  收藏  举报