rsyslog/Python/LogAnalyzer 记录和查看日志

2017-04-13更新: 加入 php7.0 信息

在新的项目中,我希望服务端、客户端的所有信息都通过独立的日志系统记录。这样的好处是:

  • 日志可以使用单独的服务器存储和管理,实现权限分离,增强生产服务器的安全性;
  • 使用通用的格式方便分析日志;
  • 所有日志统一处理;
  • 客户端可以直接和日志服务器对话。

RSYSLOG 是一个高效的日志系统,也是目前 Ubuntu 和 CentOS 默认使用的日志系统。

LogAnalyzer 是一个 PHP 写成的 Web 前端,使用它可以分析和查看 RSYSLOG 生成的日志。

经过研究,我准备直接使用这两个系统。本文记录了我在配置这两个系统中遇到的问题。

本文不会详细从头开始介绍 RSYSLOG 的配置,若希望得到这些信息,请参考下面的文章:

我的系统配置:

  • CentOS 6.3
  • RSYSLOG 5.8.10
  • LogAnalyzer 4.1.1(v4-beta)

一、筛选日志到到独立的文件

使用 GIT POST-RECEIVE 钩子部署服务端代码 一文中,我提到了两个 git 库 server.gitserverctrl.git 。在这两个库中,我使用了 Server-side hook(服务端钩子) 实现自动部署。这两个钩子程序会产生日志信息。

下面的设置,做了三件事:

  1. 将 FACILITY 为 local5 ,PRIORITY 为任意值的日志写入 all.log
  2. 将程序名称为 hhl-git-serverctrl 的日志写入 serverctrl.log
  3. 将程序名称为 hhl-git-server 的日志写入 server.log
1local5.* /var/log/hhl/all.log
2:programname,isequal,"hhl-git-serverctrl" /var/log/hhl/serverctrl.log
3:programname,isequal,"hhl-git-server" /var/log/hhl/server.log

我将这些内容放在独立的配置文件中,存放在 /etc/rsyslog.d/ 文件夹下。它会在 rsyslogd 服务重启的时候被自动载入。

二、LogAnalyzer 不显示 FACILITY 和 PRIORITY

截图可以参见这篇文章: Facility and severity not showing in logs and loganalyzer

这是因为日志文件默认采用老的格式,而 LogAnalyzer 不完全支持这种格式。RSYSLOG WIKI 提供了解决方案。需要做下面几处修改:

1. 修改 /etc/rsyslog.conf 查找下面的内容:

$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

将其替换成为:

$ActionFileDefaultTemplate RSYSLOG_SyslogProtocol23Format

这个操作将日志格式替换成了 RFC 5424 定义的格式。替换完毕记得重启 rsyslogd 。

2. 同上,将这个模版加入配置文件

$template TraditionalFormatWithPRI,"<%syslogpriority%>%syslogseverity% %timegenerated% %HOSTNAM    E% %syslogtag%%msg:::drop-last-lf%\n"

3. 进入 LogAnalyzer 的 Admin Center 界面,修改 Source 使其使用 RSyslog Format23(RFC 5424) 。

关于 LogAnalyzer ,这里还有一篇文章可以参考: 解决rsyslog+loganalyzer不能同时显示IP和主机名

2017-04-13 更新:

注意,Ubuntu 16.04 自带的 php 源为 7.0 。但 LogAnalyzer 最新版(LogAnalyzer v4.1.5) 的安装文件使用的是 mysql_connect 在 PHP 7.0 中已经被移除了,这导致在安装 LogAnalyzer 并启用用户数据库支持的时候,安装程序会报错。要解决这个问题,必须安装 PHP 5.x 。使用下面的代码安装 php5.6 及其相关支持:

1sudo add-apt-repository ppa:ondrej/php
2sudo apt-get update
3sudo apt-get install php5.6-fpm php5.6-mysql

三、使用 Python 写入日志

使用 Python 的 logging 包可以直接将日志写入 RSYSLOG 。在上面的配置文件中,我指定 FACILITY 是 local5 ,因此这里给出了相同的值。

还要注意 Formatter 第一个参数的第二段就是程序名称,RSYSLOG 可以依赖这个名称来筛选日志,写入到不同的文件。

#!/usr/bin/env python
import logging
from logging.handlers import SysLogHandler

log = logging.getLogger('git')
log.setLevel(logging.DEBUG)
log_hdlr = SysLogHandler(facility=SysLogHandler.LOG_LOCAL5, address='/dev/log')
log_format = logging.Formatter(
    '%(asctime)s hhl-%(name)s-server[%(process)d]: %(message)s:', '%b %e %H:%M:%S')
log_hdlr.setFormatter(log_format)
log.addHandler(log_hdlr)

如果希望同时加上 print 效果,加入 StreamHandler 即可。

#!/usr/bin/env python
log_hdlr2 = logging.StreamHandler(sys.stdout)
log_hdlr2.setFormatter(log_format)
log.addHandler(log_hdlr2)