首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Unix/Linux 系统自动化管理 日志管理篇(4)

Unix/Linux 系统自动化管理 日志管理篇(4)

Linux syslog-ng 监控自动化
在 Linux 系统中,缺省情况下,除 iptables, news 和 mail 子系统外,其它所有子系统的日志信息都会存储在 /var/log/messages 文件中。当系统中运行应用程序越来越多,各相关子系产生的日志也会越来越繁杂,从系统日志中分离出对自己有用的信息并对其实现自动监控往往令系统管理员头痛不已。
syslog-ng 服务就提供了一种消息粒度更小定义更为灵活的日志过滤机机制,用户可以根据不同的需要定义不同的消息源,过滤器和目的地,从而将特定的日志信息存储到特定的位置;同时,系统管理员还可以创建自动化脚本对这些分类后的日志文件做进一步的处理。例如,定时监控系统错误信息并以邮件的方式通知系统管理员。
下面我们将介绍对特定日志信息中系统错误进行自动监控的具体步骤:
  • 根据需要定义 filter 和 destination前面我们已经讲过 Linux syslog-ng 中 /etc/syslog-ng/syslog-ng.conf 文件对 source,filter 和 destination 的定义规则,在这里假设当前应用程序使用 local6 做网络管理功能,我们需要对来自这一子系统的优先级为 err(错误)的系统消息做监控和管理。
    那么,我们需要在 /etc/syslog-ng/syslog-ng.conf 文件中定义 filter 如下:
    filter  f_local6err  { level(err)  and  facility(local6); };
    定义 destination 如下:
    destination local6err { pipe(“/var/log/local6.err”  group(root)  perm(0644)); };
    表示目的地为队列 /var/log/local6.err,该队列属于 root 组,其访问属性为 0644。
  • 组建 log 配置条目定义了 filter 和 destination 之后,我们需要将它们组合在一起,形成一个 syslog-ng 的 log 配置条目,例如:
    log { source(src);  filter(f_ local6err);  destination(local6err); };
    然后重新启动 syslog-ng 服务使新配置生效:
    # /etc/init.d/syslog restart
    Shutting down syslog services                                         done
    Starting syslog services                                              done
    #
    这样,系统中来自 local6 子系统的所有 err 日志都将被存储在 /var/log/local6.err 队列中。这里之所以将日志目的设置为队列而非普通文件主要是为下一步中自动监控做准备。并且,在设置前需要调用命令 “mkfifo  /var/log/local6.err”来预告创建好这个队列。
  • 创建脚本对目标队列做自动监控为了能将 /var/log/local6.err 队列接收到系统错误及时地通知给系统管理员,我们需要创建一个脚本定期读取 local6.err 队列,一旦监测到有新的系统错误产生,就以 mail 的形式通知系统管理员。
    下面是一个监测队列的自动化脚本的 perl 实例仅供参考。
    清单 7. 监测队列的自动化脚本
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    # script monitor_fifo
    #!/usr/bin/perl

    # $fifo 为目标队列
    my $fifo = “/var/log/local6.err”;

    # 首先检测 fifo 的有效性
        local $SIG{ALRM} = sub { die "alarm\n" };
        eval {
            alarm 4;
            open(PIPE, $fifo) or die
           print “Error: $fifo can not be opened.\n”;
            alarm 0;
        };
        if ($@ =~ /alarm/) { close PIPE; exit 0; }

    # 读取 fifo
        my $allinfo = "";
        while (1)
        {
            my $line;
            eval {
                alarm 2;
                $line = <PIPE>;
                alarm 0;
            };
            if ($@ =~ /alarm/) {
                    close PIPE;
                   # 如果读到系统错误日志,邮件通知系统管理员
                if ($allinfo)
                    {
                 my $command = “echo \“$allinfo\” | mail -s \”$fifo\” root”;
                 my $rc = system($command);
                       if ($rc)
                       {
                           print “Notification to root failed.\n”;
                        }
                    }

                    exit 0;
            }
            $allinfo .= $line;
        }
        close PIPE;




    不难发现,这个自动化脚本会将目标队列中现存的所有日志以邮件的形式发送给系统 root 用户,如果系统管理员需要连续地定期地对这一目标队列进行自动监控,那么就需要借助 Linux 系统的 crontab 功能,使系统可以定期地调用 monitor_fifo 脚本。
    例如:
    使用 crontab -e 命令编辑 crontab 配置文件,并添加如下条目:
    */1 * * * * /root/monitor_fifo 1>/dev/null 2>/dev/null
    上面的例子表示每一分钟调用一次 monitor_fifo 脚本。
  • 验证配置是否成功管理员可以使用 logger 命令产生几条测试日志信息。
    # logger -p local6.err "This is a local6.err test message1."
    # logger -p local6.err "This is a local6.err test message2."
    # logger -p local6.err "This is a local6.err test message3."
    表示产生三条 facility 为 local6,level 为 err 的消息内容为 This is a local6.err test message# 的系统日志。
    如果配置正确,这条消息将会被存放在目标队列 /var/log/local6.err 中。通过系统调用 /root/monitor_fifo 脚本,这条系统错误日志信息会被邮寄给 root 用户,使用 mail 命令即可读取这些邮件。
    清单 8. mail 命令
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # mail
    mailx version nail 11.25 7/29/05.  Type ? for help.
    "/var/mail/root": 1 message 1 new
    >N  1 root@p6hv8n02.clus Tue Apr 14 03:19   21/808   /var/log/monitor.warn
    ?

    Message  1:
    From root@p6hv8n02.clusters.com  Tue Apr 14 03:19:37 2009
    X-Original-To: root
    Delivered-To: root@p6hv8n02.clusters.com
    Date: Tue, 14 Apr 2009 03:19:37 +0000
    To: root@p6hv8n02.clusters.com
    Subject: /var/log/monitor.warn
    User-Agent: nail 11.25 7/29/05
    MIME-Version: 1.0
    Content-Type: text/plain; charset=us-ascii
    Content-Transfer-Encoding: 7bit
    From: root@p6hv8n02.clusters.com (root)

    Apr 14 03:19:26 p6hv8n02 root: This is a local6.err test message1.
    Apr 14 03:19:28 p6hv8n02 root: This is a local6.err test message2.
    Apr 14 03:19:30 p6hv8n02 root: This is a local6.err test message3.




    我们可以看出,通过这一配置,系统管理员可以很方便对系统错误进行自动监控。
  • 注意事项在 Linux 系统中,一些安全设置会影响到 syslog/syslog-ng 的使用,所以在配置过程中要特别注意否则 syslog/syslog-ng 将不能正常工作。
    在 RedHat 系统中,使用 syslog/syslog-ng 时 SELinux (Security-Enhanced Linux) 服务必须关闭,可参见如下方法:
    • 修改 /etc/selinux/config 文件,设置 SELINUX=permissive。
    • 重启系统使 selinux 设置生效。
    在 SLES10 SP1 及其以上服务级的系统中,为使 syslog/syslog-ng 正常工作,我们需要修改 /etc/apparmor.d/sbin.syslog-ng 文件或者从 AppArmor 列表中删除 syslog 项。下面两个例子分别介绍如何修改 sbin.syslog-ng 文件和从 AppArmor 列表中删除 syslog 项的具体方法:
    • 修改 sbin.syslog-ng 文件,设置 fifo /var/log/local6.err 为读写权限,并重新启动 boot.apparmor 服务。如下:
    清单 9. 修改 apparmor 访问权限
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # cat /etc/apparmor.d/sbin.syslog-ng
    #include <tunables/global>
    /sbin/syslog-ng {
    #include <abstractions/base>
    .
    .
    .
    /var/run/syslog-ng.pid w,
    /var/log/local6.err wr,
    }

    # /etc/init.d/boot.apparmor restart




    • 从 AppArmor 列表中删除 syslog 项,并重新启动 boot.apparmor 服务。如下:
    #rm -f /etc/apparmor.d/sbin.syslogd
    #rm -f /etc/apparmor.d/sbin.syslog-ng
    #/etc/init.d/boot.apparmor restart
  • 取消配置Linux syslog/syslog-ng 的取消配置操作相对简单,只需要手动编辑 /etc/syslog.conf 或 /etc/syslog-ng/syslog-ng.conf 文件,删除相关的配置信息,然后重新启动 syslog 服务即可。
    在这个例子中,除取消 syslog/syslog-ng 配置外,我们还需要清除 crontab 中的配置信息。
返回列表