|  | 
 
| 本章目录: 1、linux日志管理回顾
 2、使用php-syslog-ng实现日志集中管理
 1)使用RPM安装和配置LAMP
 2)上传日志管理前端对应的查询页面,并且导入数据库模板
 3)安装新的日志服务器支持日志的mysql管理,代替原来旧的syslog日志服务器
 4)配置日志客户端
 5)通过WEB界面访问收集到的日志
 6)配置日志滚动
 
 
 1、linux日志管理回顾(sysklogd)
 linux系统中有两大类日志:
 1、内核日志                        -->/dev/log
 2、系统日志(软件日志)        -->/proc/kmsg
 
 1)默认日志文件介绍:
 ls /var/log/                --此目录下很多系统日志都存放在此,需要独立分区
 /var/log/messages        --非常重要的日志文件,几乎所有系统发生的重要错误都会记录在此
 /var/log/secure                --ssh  ftp   telnet  pop3等有关
 /var/log/dmesg         --开机时核心检测过程中所产生的信息
 /var/log/cron                --查看时间任务有关的日志
 /var/log/wtmp                --用last查看,不能直接cat
 /var/log/btmp                --用lastb查看,登录失败的记录,不能直接cat
 /var/log/lastlog          --用lastlog查看
 /var/log/boot                --boot相关
 /var/log/rpmpkgs        --rpm相关
 /var/log/maillog        --mail相关
 /var/log/spooler        --news,uucp
 /var/log/acpid                --高级电源管理
 /var/log/yum.log        --yum程序相关的日志
 
 
 还有一种日志就是每个服务所保存的日志,路径因服务会有所不同
 一般是在/var/log/服务名/        下
 httpd:
 /var/log/httpd/
 
 
 
 2)日志服务器的软件组:
 # rpm -ql sysklogd-1.4.1-44.el5
 /etc/logrotate.d/syslog                --日志滚动配置文件
 /etc/rc.d/init.d/syslog                --启动脚本
 /etc/sysconfig/syslog                --扩展配置文件
 /etc/syslog.conf                        --主配置文件
 /sbin/klogd                                --监控内核日志的命令
 /sbin/syslogd                                --临近系统日志的命令
 
 
 3)/etc/syslog.conf文件中的元素:
 
 日志设备:(facility)
 auth                   -- pam产生的日志
 authpriv                --包括权限,登录相关的信息
 cron                        --时间任务相关的信息,crontab,at
 mail                        --邮件相关的信息
 kern                   --内核产生的信息
 uucp                --unix to unxi copy  指的是unix系统之间拷贝协议相关的信息
 news                --新闻组相关的信息
 local0 到 local7 --程序自定义的日志设备
 
 
 日志级别(local0-local7):
 (local7)debug                         --调试,产生的日志是最多的一个级别
 (local6)info                        --一般信息的日志,最常用
 (local5)notice                         --最具有重要性的普通条件的信息
 (local4)warning或warn         --警告级别
 (local3)error                        --错误级别,阻止某个功能或者模块不能正常工作的信息
 (local2)crit                        --严重级别,阻止整个系统或者整个软件不能正常工作的信息
 (local1)alert                        --需要马上修改的信息
 (local0)emerg或panic        --内核崩溃等严重错误
 none                                --什么都不记录
 --上面的日志级别,从上往下级别从低到高,记录的信息是多到少,级别低的记录的信息包括级别高的
 
 
 
 设备.日志级别的使用语法:
 连接符号
 .        记录大于等于此等级
 .=        只记录等于此等级的信息
 .!        不等于此等级,也就是记录此等级之外的信息
 ;        可以写多个日志的定义
 
 
 输出设备:
 *.info;mail.none;authpriv.none;cron.none                /var/log/messages
 1、文件
 2、tty[1-6]        ttyS0
 3、远程日志 @
 
 
 解释默认日志配置文件:/etc/syslog.conf
 
 #kern.*                                                 /dev/console
 --/dev/console指的是一种外接的终端设备,有些封闭主机(没有screen,keyboard,mouse等),可能会需要外接设备连接
 
 *.info;mail.none;authpriv.none;cron.none                /var/log/messages
 --记录所有日志类型的info级别的信息到/var/log/messages,除了mail,authpriv,cron的信息
 
 authpriv.*                                              /var/log/secure
 --记录authpriv的所有级别的信息到/var/log/secure
 
 mail.*                                                  -/var/log/maillog
 --记录邮件的所有级别的信息到/var/log/maillog,关于减号-的意思为:因为邮件的信息相比于其他的来说是比较大的,所以是采用异步的方式,先存放在内存里,然后按一定的事件触发,或者到达一定的大小写到磁盘,而不是象其他的日志那样,产生了就马上写到磁盘。
 
 cron.*                                                  /var/log/cron
 --记录时间任务所有级别的信息到/var/log/cron
 
 *.emerg                                                 *
 --记录所有日志设备的emerg信息以wall的方式发送给每个登录到系统的人知道
 
 uucp,news.crit                                          /var/log/spooler
 --记录uucp,new的crit信息到/var/log/spooler
 
 local7.*                                                /var/log/boot.log
 --把boot messages记录到/var/log/boot.log
 
 
 4)配置实例
 例1:
 只记录mail的info级别信息到/var/log/newmaillog
 mail.=info                /var/log/newmaillog
 
 
 例2:
 记录时间任务的info级别以上的所有信息(除了err外)到/var/log/newcron
 cron.info;cron.!err                        /var/log/newcron
 cron.err                                        /var/log/cron.err
 
 例3:
 开启debug日志(当服务配置时发生错误,而又无法得知错误是如何造成):
 # vim /etc/syslog.conf
 *.debug                                                 /var/log/debug.log
 
 
 例4:
 远程日志(日志集中管理):
 
 client(*)-->server
 
 服务端配置:
 # vi /etc/sysconfig/syslog
 SYSLOGD_OPTIONS="-r -x -m 0"
 -r enables logging from remote machines
 -x disables DNS lookups on messages recieved with -r
 # service syslog restart
 # netstat -unlp |grep :514
 
 日志客户端配置:
 # vim /etc/syslog.conf
 *.*                        @server_ip
 
 
 logrotate   -  rotates,  compresses,  and mails system logs
 
 日志轮转        rotate                日志切割
 # rpm -q logrotate                --确认软件是否已经安装
 logrotate-3.7.4-9
 
 # rpm -ql logrotate
 /etc/cron.daily/logrotate                --crontab按天来执行logrotate
 /etc/logrotate.conf                        --主配置文件
 /etc/logrotate.d                                --扩展配置文件
 /usr/sbin/logrotate
 
 
 常见的默认已经定义轮转的日志有:
 /var/log/messages
 /var/log/cron
 /var/log/boot.log
 /var/log/maillog
 /var/log/secure
 
 
 # vim /etc/logrotate.conf         --配置文件
 # see "man logrotate" for details
 # rotate log files weekly
 weekly                                --默认是一个星期rotate一次
 
 # keep 4 weeks worth of backlogs
 rotate 4                                --默认保留4个
 
 # create new (empty) log files after rotating old ones
 create                                --rotate后,创建一个新的代替
 
 # uncomment this if you want your log files compressed
 #compress                        --默认没有打开日志压缩功能
 
 # RPM packages drop log rotation information into this directory
 include /etc/logrotate.d        --这表示/etc/logrotate.d目录下的所有配置文件都生效
 
 # no packages own wtmp         -- we'll rotate them here
 /var/log/wtmp {                --针对wtmp单独的配置,这里是绝对路径
 monthly                        --一个月rotate一次,取代上面的全局配置里的一个星期一次
 minsize 1M                        --指定最小大小为1M,才rotate,就算是时间到了,大小没有1M,也不rotate
 create 0664 root utmp        --定义创建的为属性为0664,属主为root,属组utmp
 rotate 1                        --保留一个
 }
 
 # vim /etc/logrotate.d/syslog
 /var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron {
 sharedscripts
 prerotate
 echo "before rotate" | mail root    --轮转前发邮件
 endscript
 sharedscripts
 postrotate
 /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
 /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
 echo "end rotate" |mail root                --轮转后发邮件
 endscript
 }
 
 
 
 # logrotate -vf /etc/logrotate.conf --强制轮转日志,并查看轮转的过程
 
 
 给/var/log/debug.log做日志滚动:
 # vim /etc/logrotate.d/debug
 /var/log/debug.log {
 missingok
 notifempty
 size 50k
 rotate 365
 daily
 compress
 dateext
 create 0600 root user01
 postrotate
 /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
 endscript
 }
 
 # /usr/sbin/logrotate /etc/logrotate.conf                        --按照配置文件来作日志滚动,如果不符合滚动要求,则放弃。
 # /usr/sbin/logrotate -vf /etc/logrotate.conf                --强制滚动日志
 
 
 总结:
 1、配置文件有两个,logrotate.conf全局的配置文件,/etc/logrotate.d/*局部配置文件
 2、如果全局配置文件与局配置文件中有冲突,以局部配置文件中的选项为准
 3、手工滚动:/usr/sbin/logrotate /etc/logrotate.conf 或强制:/usr/sbin/logrotate -vf /etc/logrotate.conf
 4、自动滚日志crontab--> /etc/cron.daily/logrotate
 
 
 
 
 
 
 
 2、使用php-syslog-ng+LAMP+syslog-ng实现日志集中管理
 
 
 
 服务器上安装的软件组成:
 LAMP
 syslog-ng                        --日志服务器
 php-syslog-ng                --前端查询页面
 
 客户端需要安装的软件:
 syslog-ng-client        --日志客户端
 
 1)使用RPM安装和配置LAMP
 # yum -y install httpd php php-mysql mysql-server
 # service httpd start
 # chkconfig httpd on
 # service mysqld start
 # chkconfig mysqld on
 
 2)上传日志管理前端对应的查询页面,并且导入数据库模板
 上传页面:
 # tar xzvf php-syslog-ng-2.9.1r10.tar.gz
 # cp -r html/* /var/www/html/
 
 新建数据库和对应账号:
 mysql> create database syslog;
 Query OK, 1 row affected (0.00 sec)
 
 mysql> grant all on syslog.* to dbuser@'localhost' identified by '123';
 Query OK, 0 rows affected (0.00 sec)
 
 导入数据:
 # mysql -udbuser -p123 syslog < /var/www/html/install/sql/dbsetup.sql
 
 
 3)安装新的日志服务器支持日志的mysql管理,代替原来旧的syslog日志服务器
 # rpm -ivh syslog-ng-3.0.9-1.rhel5.i386.rpm
 # chkconfig --list |grep syslog
 syslog-ng       0:off   1:off   2:on    3:on    4:on    5:on    6:off
 
 修改syslog-ng默认配置文件,支持从网络接受来自其它服务器发送过来的日志,另外把接收到的日志和本地日志写入数据库对应的库和表中:
 # vim /opt/syslog-ng/etc/syslog-ng.conf                 --把原来的配置清空,加入以下内容
 @version: 3.0
 source s_all {
 internal();
 unix-stream("/dev/log");
 file("/proc/kmsg" program_override("kernel"));
 udp(
 ip(0.0.0.0)
 port(514)
 );
 tcp(
 ip(0.0.0.0)
 port(514)
 );
 };
 destination d_mysql {
 pipe("/var/log/mysql.pipe"
 template("INSERT INTO logs
 (host, facility, priority, level, tag, datetime, program, msg)
 VALUES ( '$HOST', '$FACILITY', '$PRIORITY', '$LEVEL', '$TAG', '$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC',
 '$PROGRAM', '$MSG' );\n") template-escape(yes));
 };
 
 log {
 source(s_all);
 destination(d_mysql);
 };
 
 重启服务:
 # /etc/init.d/syslog-ng restart
 # netstat -nlp|grep :514
 tcp        0      0 0.0.0.0:514                 0.0.0.0:*                   LISTEN      4283/syslog-ng
 udp        0      0 0.0.0.0:514                 0.0.0.0:*                               4283/syslog-ng
 
 通过脚本把syslog-ng接收到的所有日志都写入mysql中
 # vim /root/syslog2myssql.sh
 #!/bin/bash
 
 if [ ! -e /var/log/mysql.pipe ]
 then
 mkfifo /var/log/mysql.pipe
 fi
 while [ -e /var/log/mysql.pipe ]
 do
 mysql -udbuser -p123 syslog < /var/log/mysql.pipe >/dev/null
 done
 
 在后台运行这个程序
 # nohup /bin/bash /root/syslog2myssql.sh  &                --使用nohup的方式启动,这样脚本运行时不需要依赖任何的端终
 
 设置开机自启动:
 # vim /etc/rc.local
 nohup /bin/bash /root/syslog2myssql.sh  &
 
 
 4)配置日志客户端
 # scp syslog-ng-client-3.0.9-1.rhel5.i386.rpm 192.168.1.11:/root
 # rpm -ivh syslog-ng-client-3.0.9-1.rhel5.i386.rpm        --安装此客户端后,同样原来的日志服务器也会被关闭,使用新的日志服务器
 # vim /opt/syslog-ng/etc/syslog-ng.conf
 @version: 3.0
 
 options {
 };
 
 source s_local {
 internal();
 unix-stream("/dev/log");
 file("/proc/kmsg" program_override("kernel"));
 };
 
 
 destination d_messages { file("/var/log/messages"); };                --两个日志目标,一个本地,一个远程日志服务器
 destination d_logserver { udp("192.168.0.1");};
 
 log {
 source(s_local);
 destination(d_messages);
 destination(d_logserver);
 };
 
 
 重启服务:
 # service syslog-ng restart
 
 5)通过WEB界面访问收集到的日志
 
 1、验证server(192.168.1.10)和clinet(192.168.1.11)的日志有没有被 写入数据库
 在192.168.1.10登录数据库查看
 mysql> select * from logs;
 +--------------+----------+----------+--------+------+---------------------+-----------+-------------------------------------------------------------------------------------------------------+-----+
 | host         | facility | priority | level  | tag  | datetime            | program   | msg                                                                                                   | seq |
 +--------------+----------+----------+--------+------+---------------------+-----------+-------------------------------------------------------------------------------------------------------+-----+
 | logserver    | syslog   | info     | info   | 2e   | 2011-09-25 15:26:47 | syslog-ng | Termination requested via signal, terminating;                                                        |  19 |
 | logserver    | syslog   | notice   | notice | 2d   | 2011-09-25 15:26:47 | syslog-ng | syslog-ng shutting down; version='3.0.9'                                                              |  20 |
 | 192.168.1.11 | syslog   | info     | info   | 2e   | 2011-09-25 15:26:54 | syslog-ng | Termination requested via signal, terminating;                                                        |  22 |
 | 192.168.1.11 | syslog   | notice   | notice | 2d   | 2011-09-25 15:26:54 | syslog-ng | syslog-ng shutting down; version='3.0.9'                                                              |  23 |
 
 2、为了方便日志的查询及管理使用php-syslog-ng提供WEB界面的日志管理
 # chown -R apache /var/www/html/config
 # firefox http://192.168.1.10/install                --保证以下都是通过检测的,不然无法进行后续的安装
 
 
 
 
 记住密码,然后点击View Site访问站点页面,并使用对应的账号和密码登录,部署到此结束。
 
 
 
 
 6)配置日志滚动(最小滚动周期1天)
 # vim /var/www/html/config/config.php
 7 define('LOGROTATERETENTION', 30);                --定义保存多少份旧日志
 
 手工滚动日志:
 # vim /var/www/html/scripts/logrotate.php
 6 $APP_ROOT = '/var/www/html';
 
 # /var/www/html/scripts/logrotate.php
 
 
 自动滚动:
 # crontab -e
 55 23 * * * /www/html/scripts/logrotate.php &> /dev/null
 
 
 打补丁:
 # cp logrotate.patch /var/www/html/scripts
 # cd !$
 # patch -p1 logrotate.php < logrotate.patch
 
 | 
 |