Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1027192
  • 博文数量: 361
  • 博客积分: 25
  • 博客等级: 民兵
  • 技术积分: 1759
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-22 23:18
个人简介

学海无涯 个人blog lnmps.com 新站

文章分类

全部博文(361)

文章存档

2017年(1)

2015年(2)

2014年(55)

2013年(303)

分类: LINUX

2013-04-23 14:03:35

原文地址:日志服务器 作者:qingchn

首先解释什么是日志服务器, 一般意义上的日志服务器是指,S/C模式下用于专门存放系统日志或者程序日志的服务器。在Linux系统中,服务器会产生大量的日志,根据一般的日志的分类,可以把日志分为以下三种:

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

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

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

/var/log目录下常见的日志为:

access-log 纪录HTTP/web的传输

acct/pacct 纪录用户命令

aculog 纪录MODEM的活动

btmp 纪录失败的纪录

lastlog 纪录最近几次成功登录的事件和最后一次不成功的登录

messages syslog中记录信息(有的链接到syslog文件)

sudolog 纪录使用sudo发出的命令

sulog 纪录使用su命令的使用

syslog syslog中记录信息(通常链接到messages文件)

utmp 纪录当前登录的每个用户

wtmp 一个用户每次登录进入和退出时间的永久纪录

xferlog 纪录FTP会话

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

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

概述

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

# cat /etc/syslog.conf

# Log all kernel messages to the console.

# Logging much else clutters up the screen.

#kern.*                         /dev/console

 

# Log anything (except mail) of level info or higher.

# Don't log private authentication messages!

*.info;mail.none;authpriv.none;cron.none        /var/log/messages

 

# The authpriv file has restricted access.

authpriv.*                      /var/log/secure

 

# Log all the mail messages in one place.

mail.*                          -/var/log/maillog

 

 

# Log cron stuff

cron.*                          /var/log/cron

 

# Everybody gets emergency messages

*.emerg                         *

 

# Save news errors of level crit and higher in a special file.

uucp,news.crit                      /var/log/spooler

httpd.*                                                 @192.168.10.17

# Save boot messages also to boot.log

local7.*                        /var/log/boot.log

以上配置文件#号开头的为注释,其余均为配置,并且可以更改:每一行由两个部分组成。第一个部分是一个或多个“选择条件”;上例中的选择条件是“mail”。选择条件后面跟一些空格字符,然后是一个“操作动作”如:

mail.*                          -/var/log/maillog

选择条件本身分为两个字段,之间用一个小数点(.)分隔。前一字段是一项服务,后一字段是一个优先级。选择条件其实是对消息类型的一种分类,这种分类便于人们把不同类型的消息发送到不同的地方。在同一个syslog配置行上允许出现一个以上的选择条件,但必须用分号(;)把它们分隔开。上面给出的例子里只有一个选择条件“mail”。大家可以在我们后面给出的那个完整的syslog配置文件示例里看到同时有多个选择条件的配置行。

常见的服务类型:

1

优先级是选择条件的第二个字段,它代表消息的紧急程度。对一个应用程序来说,它发出的哪些消息属于哪一种优先级是由当初编写它的程序员决定的,应用程序的使用者只能接受这样的安排——除非打算重新编译系统应用程序。表2按严重程度由低到高的顺序列出了所有可能的优先级.常见的:

2

不同的服务类型有不同的优先级,数值较大的优先级涵盖数值较小的优先级。如果某个选择条件只给出了一个优先级而没有使用任何优先级限定符,对应于这个优先级的消息以及所有更紧急的消息类型都将包括在内。比如说,如果某个选择条件里的优先级是“warning”,它实际上将把“warning”、“err”、“crit”、“alert”和“emerg”都包括在内.

syslog允许人们使用三种限定符对优先级进行修饰:星号(*)、等号(=)和叹号(!)。熟悉规则表达式的读者应该对这三种限定符不会感到陌生。星号(*)的含义是“把本项服务生成的所有日志消息都发送到操作动作指定的地点”。就像它在规则表达式里的作用一样,星号代表“任何东西”。在前面给出的例子里,“mail.*”将把所有优先级的消息都发送到操作动作指定的/var/log/mail文件里。使用“*”限定符与使用“debug”优先级的效果完全一样,后者也将把所有类型的消息发送到指定地点。

等号(=)的含义是“只把本项服务生成的本优先级的日志消息都发送到操作动作指定的地点”。比如说,可以用“=”限定符只发送调试消息而不发送其他更紧急的消息(这将为应用程序减轻很多负担)。当你只需要发送特定优先级别的消息时,就要使用等号限定符。

就像它在编程时的用法一样,等号意味着等于且仅等于。叹号(!)的含义是“把本项服务生成的所有日志消息都发送到操作动作指定的地点,但本优先级的消息不包括在内”。比如说,这条syslog配置行将把除info优先级以外的所有消息发送到/var/log/mail文件里。

mail.*;mail.!info/var/log/mail

日志信息可以分别记录到多个文件里,还可以发送到命名管道、其他程序甚至另一台机器。

由于syslog的过滤性能和可配置性缺陷,在此我们选择使用syslog-ngsyslog-ng号称是下一代的syslog (ng) next generation服务。是一个商业版的开源软件。其官网地址为:

http://www.balabit.com/network-security/syslog-ng/

3

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

另外需要的一个软件是php-syslog-ng,是一个可以web来检索数据库中的日志信息,更好的呈现日志。其官网地址是:

php-syslog-ng已经更改名字为logzilla,在3.0版本以后做了licence限制,所以在此采用2.99的版本。

整体架构如下图:

4

1,  需要安装PHPGDMySQLHTTP

yum –y install php gd mysql http

     2,安装其他支持包

yum –y install libdbi* libnet

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

cpan –i Digest::SHA1

cpan –I Net::MySQL

   3,下载相关软件包

cd ~

mkdir sysserver

cd sysserver/

wget

wget

cp eventlog_0.2.9.tar.gz /usr/src/redhat/SOURCES/

cd /usr/src/redhat/SOURCES/

tar zxvf  eventlog_0.2.9.tar.gz

cd eventlog-0.2.9/

rpmbuild --ba eventlog.spec.bb

cd /usr/src/redhat/RPMS/x86_64

rpm -Uvh libevtlog*

cd ~/sysserver

rpm -Uvh syslog-ng-3.0.3-1.rhel5.i386.rpm

安装logzilla

cd /var/www/html/

wget

tar -zxvf logzilla_v2.9.9o.tgz

mkdir -p /var/log/logzilla

5,配置Mysql

mysql -u -p
mysql> SELECT @@event_scheduler;
+-------------------+
| @@event_scheduler |
+-------------------+
| OFF               |
+-------------------+
1 row in set (0.00 sec)

低于Mysql5.1版本会提示如下,如不打算升级到logzilla3.0,没有关系,可以略过此步骤。
mysql> SELECT @@event_scheduler;
ERROR 1193 (HY000): Unknown system variable 'event_scheduler'

激活event_scheduler


mysql> SET GLOBAL event_scheduler = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@event_scheduler;
+-------------------+
| @@event_scheduler |
+-------------------+
| ON                |
+-------------------+
1 row in set (0.00 sec)

mysql> quit;

 

6,修改syslog-ng配置

vim /opt/syslog-ng/etc/syslog-ng.conf

###########################################################################################

options {

      long_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(no);

      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)

   );

};

 

# Tell syslog-ng to log to our new destination

log {

   source(s_local);

      destination(d_logzilla);

};

 

log {

   source(s_local);

      destination(d_messages);

};

7,修改httpd配置,加入虚拟主机加入如下配置

    ServerAdmin qingchn@163.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

# LogZilla

Alias /logs "/var/www/html/php-syslog-ng/html/"

    Options Indexes MultiViews FollowSymLinks

    AllowOverride All

        Order allow,deny

        Allow from all

重启http服务

service httpd restart

8,修改php配置 红色部分为更改后的

vim /etc/php.ini

memory_limit = 128M

max_execution_time = 300

display_errors = On

magic_quotes_gpc = On

chmod 777 -R php-syslog-ng/

service httpd restart

9,配置日志自动分隔

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

10,添加自动脚本

crontab -e

@daily php /var/www/html/php-syslog-ng/scprits/logrotate.php >> /var/log/php-syslog-ng/logrotate.log

@daily /usr/bin/find /var/www/html/php-syslog-ng/html/jpcache/ -atime 1 -exec rm -f '{}' ';'

*/5 * * * * php /var/log/php-syslog-ng/reloadcache.log

11.安装logzilla

 

12,替换脚本

cd /var/www/html/php-syslog-ng/scripts/

./fixpaths.sh

Modifying ../scripts/reloadcache.php

Modifying ../scripts/resetusers.sh

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

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

Modifying ../scripts/contrib/system_configs/crontab

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

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

Modifying ../scripts/db_insert.pl

Modifying ../scripts/logrotate.php

Modifying ../scripts/lpdcache.php

/etc/init.d/syslog-ng restart           #重启syslog-ng服务

13,客户端的设置。

vim /etc/syslog.conf

*.debug                                                 @192.168.10.223

#可以根据具体设置添加,优先级。

service syslog restart   #重启客户机syslog服务

Shutting down kernel logger:                               [  OK  ]

Shutting down system logger:                               [  OK  ]

Starting system logger:                                    [  OK  ]

Starting kernel logger:                                    [  OK  ]

测试

logger local4.err "this is  a test message"

在服务器上能够看到该信息。证明安装完成。

 

由于,这篇文档是用word编写的,排版比较整齐,但是发表在博客上,就显得有点乱了。

在生产环境部署的时候,把所有的安装好了以后发现,日志没有写到数据库里面,

运行db_insert.pl  发现其中21行,有错误出现

查看行

 21 use DBI;

因为这是一个perl脚本,需要调用 DBI数据接口

所以需要安装

perl-DBI-1.609-3.fc12.i686

安装上该包,重新检测发现可以把日志写入数据库了。

 

阅读(978) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~