公司最近不断地增加服务器,但大量的日志查看起来又非常不方便,通过一些专用的日志查看工具(multitailSystem Log Viewerswatch等)是方便不少,但一台一台的查看也很烦啊。针对这一点,我们现在就来把多个主机的系统日志集中收集到一个主机上来管理,即Linux上的中央系统日志服务器。一般意义上的日志服务器是指,S/C模式下用于专门存放系统日志或者程序日志的服务器。

之前也有用过cactisyslog插件来监控服务器的日志,但cacti主要是用来监控系统状态和服务的,大量的日志不断地传送到cacti服务器上,一旦弄不好cacti服务器就挂掉了,所以最好的办法就是将日志监控和cacti分开,这样就不会影响到cacti的正常监控了。

一、Linux系统日志简介

Linux系统中,服务器会产生大量的日志,根据一般的日志的分类,可以把日志分为以下三种:

连接时间日志--由多个程序执行,把纪录写入到/var/log/wtmp/var/run/utmplogin等程序更新wtmputmp文件,使系统管理员能够跟踪谁在何时登录到系统。

进程统计--由系统内核执行。当一个进程终止时,为每个进程往进程统计文件(pacctacct)中写一个纪录。进程统计的目的是为系统中的基本服务提供命令使用统计。

错误日志--syslogd8)执行。各种系统守护进程、用户程序和内核通过syslog3)向文件/var/log/messages报告值得注意的事件。另外有许多UNIX程序创建日志。像HTTPFTP这样提供网络服务的服务器也保持详细的日志。

日志对于安全来说,非常重要,他记录了系统每天发生的各种各样的事情,你可以通过它来检查错误发生的原因,或者受到***时***者留下的痕迹。日志主要的功能有:审计和监测。他还可以实时的监测系统状态,监测和追踪侵入者等等。

既然日志那么重要,所以保存日志也就显的格外重要,这就要回到我们本文的开头,日志服务器,单纯的讲,系统只会把日志存放在本地,但是当一个系统工程师管理十台甚至上百台的服务器时,如果他需要查看日志,那么他就需要一台一台服务器的登录查看,这样显然是效率最低下的,所以,我们把所有的服务器的日志都发送到一台服务器上去,那么就可以节省很多不必要的登录和重复操作。

二、下一代系统日志工具syslog-ng介绍

SyslogLinux系统默认的日志守护进程,默认的syslog配置文件是/etc/syslog.conf文件。syslog守护进程是可配置的,它允许人们为每一种类型的系统信息精确地指定一个存放地点。

比较 syslog syslog-ng 具有众多高级的功能:更好的网络支持,更加方便的配置,集中式的网络日志存储,并且更具有弹性。比如,使用syslogd时,所有的iptables日志与其他内核日志一起全部存储到了kern.log文件里。Syslog-ng则可以让你有选择性的将iptables部分分出到另外的日志文件中。Syslogd仅能使用UDP协议,Syslog-ng 可以使用UDPTCP协议。所以你可以在加密的网络隧道中传输日志到集中日志服务器。

syslog-ng的一个设计原则就是建立更好的消息过滤粒度,syslog-ng能够进行基于内容和优先权/facility的过滤。另一个设计原则是更容易进行不同防火墙网段的信息转发,它支持主机链,即使日志消息经过了许多计算机的转发,也可以找出原发主机地址和整个转发链。最后的一个设计原则就是尽量使配置文件强大和简洁。

三、php-syslog-ng介绍

配合syslog-ng做日志服务器还需要另一个软件php-syslog-ng,是一个可以web来检索数据库中的日志信息,更好的呈现日志。其官网地址是:http://www.logzilla.info/

php-syslog-ng已经更改名字为logzilla,在3.0版本以后做了licence限制,需要定期去更新license.txt来达到延长使用期限的目的,个人感觉比较麻烦,同时还有主机及日志数的限制,所以在此采用2.99的版本。

四、系统架构

    在syslog-ng+logzilla日志服务器架构中,syslog-ng负责实现收集Linuxwindows服务器的日志,logzilla可以使管理员通过浏览器的访问来查看所有服务器的日志情况。

五、安装前的准备工作

1. 关闭SELinux

查看SELinux的状态

getenforce

如果是开启状态,则

vi /etc/selinux/config

#SELINUX=enforcing     #注释掉

#SELINUXTYPE=targeted  #注释掉

SELINUX=disabled  #增加

重启系统

reboot

2. 开启防火墙80514端口

vi /etc/sysconfig/iptables

添加两条规则

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 514 -j ACCEPT

3.安装LAMP和需要用到的额外软件包

yum -y install gcc gcc-c++ flex pcre pcre-devel glib2 glib2-devel openssl-devel php gd gd-devel php-gd mysql php-mysql mysql-server mysql-devel httpd

4.平台初始化

yum -y install libdbi* libnet

cpan Date::Calc Text::LevenshteinXS String::CRC32

cpan -i Digest::SHA1

cpan -i Net::MySQL

5.下载软件

cd /usr/local/src/

wget http://www.balabit.com/downloads/files/eventlog/0.2/eventlog_0.2.12.tar.gz

wget http://www.balabit.com/downloads/files/libol/0.3/libol-0.3.18.tar.gz

wget http://www.balabit.com/downloads/files/syslog-ng/open-source-edition/3.3.5/source/syslog-ng_3.3.5.tar.gz

wget http://php-syslog-ng.googlecode.com/files/logzilla_v2.9.9o.tgz

六、syslog-ngtlogzilla的安装

1.安装eventlog

tar -zxvf eventlog_0.2.12.tar.gz

cd eventlog-0.2.12/

./configure --prefix=/usr/local/eventlog

make && make install

2.安装libol

tar -zxvf libol-0.3.18.tar.gz

cd libol-0.3.18

./configure --prefix=/usr/local/libol

make && make install

3.安装syslog-ng

# 设置环境变量

export PKG_CONFIG_PATH=/usr/local/eventlog/lib/pkgconfig/

tar -zxvf syslog-ng_3.3.5.tar.gz

cd syslog-ng-3.3.5/

./configure --prefix=/usr/local/syslog-ng --with-libol=/usr/local/libol/

出现下图内容则表示OK

./configure出现的错误:

错误1configure:error: Package requirements (glib-2.0 >= 2.10.1 gmodule-2.0 gthread-2.0) were not met:

解决办法:yum -y install glib2-devel

错误2configure: error: OpenSSL is required when glib-2.0 << 2.16.0

configure: error: ./configure.gnu failed for modules/afmongodb/libmongo-client

解决办法:yum -y install openssl-devel

编译安装syslog-ng

make && make install

4.安装logzilla

tar -zxvf logzilla_v2.9.9o.tgz -C /var/www/html/

创建logzilla日志的存放目录

mkdir -p /var/log/logzilla

php-syslog-ng目录apache用户的权限

chown -R apache:apache /var/www/html/php-syslog-ng/

七、配置syslog-nglogzilla

1. mysql的初始化和配置

vi /etc/my.cnf

由于search_cache表采用的是MEMORY存储引擎,有大小的限制,修改一下/etc/my.cnf,添加以下内容:

tmp_table_size=1G

max_heap_table_size=1G

mysql以服务的方式开机启动

chkconfig mysqld on

启动mysql

service mysqld start

设置mysqlroot密码

cd /usr/bin/

mysqladmin -u root -h localhost password 'mysql123456'

登录mysql测试

mysql -u root -p

输入密码:mysql123456

Exit

2.修改syslog-ng配置

syslog-ng初始配置文件备份,我们要重新创建配置文件

mv /usr/local/syslog-ng/etc/syslog-ng.conf /usr/local/syslog-ng/etc/syslog-ng.conf.bak

vi /usr/local/syslog-ng/etc/syslog-ng.conf

############################################################################# 
# Default syslog-ng.conf file which collects all local logs into a 
# single file called /var/log/messages. 
# 
 
@version: 3.3 
@include "scl.conf" 
 
source s_local { 
        system(); 
        internal(); 
        unix-stream("/dev/log");   
        file("/proc/kmsg" program_override("kernel: ")); 
}; 
 
source s_network { 
        udp(ip(0.0.0.0) port(514)); 
}; 
 
destination d_messages { 
        file("/var/log/messages"); 
}; 
 
options { 
      chain_hostnames(off); 
      # doesn't actually help on Solaris, log(3) truncates at 1024 chars 
      log_msg_size(8192); 
      # buffer just a little for performance 
      # sync(1); <- Deprecated - use flush_lines() instead 
      flush_lines(1); 
      # memory is cheap, buffer messages unable to write (like to loghost) 
      log_fifo_size(16384); 
      # Hosts we don't want syslog from 
      #bad_hostname("^(ctld.|cmd|tmd|last)$"); 
      # The time to wait before a dead connection is reestablished (seconds) 
      time_reopen(10); 
      #Use DNS so that our good names are used, not hostnames 
      use_dns(yes); 
      dns_cache(yes); 
      #Use the whole DNS name 
      use_fqdn(yes); 
      keep_hostname(yes); 
      chain_hostnames(no); 
      #Read permission for everyone 
      perm(0644); 
      # The default action of syslog-ng 1.6.0 is to log a STATS line 
      # to the file every 10 minutes.  That's pretty ugly after a while. 
      # Change it to every 12 hours so you get a nice daily update of 
      # # how many messages syslog-ng missed (0). 
      # stats(43200); 
}; 
 
destination d_logzilla { 
   program("/var/www/html/php-syslog-ng/scripts/db_insert.pl" 
   template("$HOST\t$FACILITY\t$PRIORITY\t$LEVEL\t$TAG\t$YEAR-$MONTH-$DAY\t$HOUR:$MIN:$SEC\t$PROGRAM\t$MSG\n") 
   template_escape(yes) 
   ); 
}; 
 
log { 
        source(s_local); 
 
        # uncomment this line to open port 514 to receive messages 
        source(s_network); 
        destination(d_logzilla); 
};

3.修改apache的配置

vi /etc/httpd/conf/httpd.conf

找到以下行,将其修改为下面内容

ServerName www.example.com:80 
DirectoryIndex index.html index.htm default.htm default.html index.php index.php3 index.jsp index.html.var 
<VirtualHost *:80> 
    ServerAdmin webmaster@log.syslog.com 
    DocumentRoot /var/www/html/php-syslog-ng/html/ 
    ServerName syslog.com.cn 
    ErrorLog logs/syslog.com.cn-error_log 
    CustomLog logs/syslog.com.cn-access_log common 
    Alias /logs "/var/www/html/php-syslog-ng/html/" 
    <Directory "/var/www/html/php-syslog-ng/html/"> 
        Options Indexes MultiViews FollowSymLinks 
        AllowOverride All 
            Order allow,deny 
            Allow from all 
    </Directory> 
</VirtualHost>

4.修改php.ini

vi /etc/php.ini

max_execution_time = 300   # 最大运行时间 
display_errors = On         # 显示所有错误信息 
magic_quotes_gpc = On

 让apache以服务的方式开机启动

chkconfig httpd on

启动apache

service httpd start

5.自动分隔logzilla日志

cp /var/www/html/php-syslog-ng/scripts/contrib/system_configs/logrotate.d /etc/logrotate.d/logzilla

添加自动运行作业

crontab -e

@daily /usr/bin/php /var/www/html/php-syslog-ng/scripts/logrotate.php >> /var/log/logzilla/logrotate.log
@daily /usr/bin/find /var/www/html/php-syslog-ng/html/jpcache/ -atime 1 -exec rm -f '{}' ';'
*/5 * * * * /usr/bin/php /var/www/html/php-syslog-ng/scripts/reloadcache.php >> /var/log/logzilla/reloadcache.log

 logrotate.phpreloadcache.php可执行权限

chmod +x logrotate.php

chmod +x reloadcache.php

6.修改db_insert.pl文件

vi /var/www/html/php-syslog-ng/scripts/db_insert.pl

找到所有包含

/var/www/php-syslog-ng/html/config/config.php

的行,改为

/var/www/html/php-syslog-ng/html/config/config.php

7.配置syslog-ng开机启动

vi /etc/rc.d/rc.local

加入下面行

/usr/local/syslog-ng/sbin/syslog-ng

启动syslog-ng

/usr/local/syslog-ng/sbin/syslog-ng

八、通过WEB方式安装logzilla

1.打开浏览器输入:http://192.168.0.231/logs

如果此时-GD supportUnavailable,解决方法如下:

yum -y install gd-devel php-gd

service httpd restart

ps -ef |grep syslog-ng

找到syslog-ng的进程, kill掉,然后启动syslog-ng

/usr/local/syslog-ng/sbin/syslog-ng

确认所有项都无误后,点击&ldquo;Next>>&rdquo;

Web登录的用户为:admin,密码为:password,点击&ldquo;Install CEMDB&rdquo;

注:如果点击install CEMDB没有反应的话,请使用Firefox进行安装。

2.替换脚本路径

cd php-syslog-ng/scripts/

./fixpaths.sh

Updating all files with a base path of /var/www/php-syslog-ng

Modifying ../scripts/lpdcache.php

Modifying ../scripts/db_insert.pl

Modifying ../scripts/logrotate.php

Modifying ../scripts/resetusers.sh

Modifying ../scripts/contrib/dbgen/dbgen.pl

Modifying ../scripts/contrib/system_configs/crontab

Modifying ../scripts/contrib/system_configs/syslog-ng.conf

Modifying ../scripts/contrib/system_configs/logzilla.apache

Modifying ../scripts/contrib/loggen/find_missing_sequences.pl

Modifying ../scripts/reloadcache.php

出现以上内容,则表示执行成功。

3.重启syslog-ng

ps -ef | grep syslog-ng

找到syslog-ng的进程,kill掉,启动syslog-ng

/usr/local/syslog-ng/sbin/syslog-ng

4.添加verdana.ttf字体

mkdir -p /usr/share/fonts/truetype/msttcorefonts/

上传windows机器的verdana.ttf字体到此目录下,否则点graph时会提示找不到此字体文件。

九、客户机配置

1.Linux客户机配置

vi /etc/syslog.conf

修改syslog的配置文件,添加以下内容:

*.*       @192.168.0.231

重启syslog服务

service syslog restart

2.windows客户机配置

windows日志不支持syslog格式,需要安装Evtsys_4.4.3_64-Bit.zip,下载地址为:http://code.google.com/p/eventlog-to-syslog/downloads/list

解压后是两个文件evtsys.dllevtsys.exe

把这两个文件拷贝到 c:\windows\system32目录下。

打开Windows命令提示符(开始->运行 输入CMD

evtsys &ndash;i &ndash;h 192.168.0.231   #(日志服务器的IP地址)

参数说明:

-i 表示安装成系统服务

-h 指定log服务器的IP地址

如果要卸载evtsys,则:

net stop evtsys

evtsys -u

启动该服务:

net start evtsys

附:不能显示日志当中带有"<"、">"的问题,如思科系统的日志

解决方法:

在tailresult.php和regularresult.php中查找

if (CISCO_TAG_PARSE ) 
   { 
        $row['msg'] = preg_replace('/\s:/', ':', $row['msg']); 
        $row['msg'] = preg_replace('/.*(%.*?:.*)/', '$1', $row['msg']); 
    }

添加如下内容

$row['msg'] = preg_replace('/</', ' ', $row['msg']);
$row['msg'] = preg_replace('/>/', ' ', $row['msg']);

对于服务器的一些优化,请参见我的另一篇博文: http://www.linuxidc.com/Linux/2012-05/61492.htm 的附1、附3和附4内容。

参考文献:

http://blog.liuts.com/post/209/

http://bbs.chinaunix.net/thread-2042734-1-1.html

在此感谢以上两位作者,谢谢!