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.git
和 serverctrl.git
。在这两个库中,我使用了 Server-side hook(服务端钩子) 实现自动部署。这两个钩子程序会产生日志信息。
下面的设置,做了三件事:
- 将 FACILITY 为 local5 ,PRIORITY 为任意值的日志写入
all.log
; - 将程序名称为
hhl-git-serverctrl
的日志写入serverctrl.log
; - 将程序名称为
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)
- 文章ID:2222
- 原文作者:zrong
- 原文链接:https://blog.zengrong.net/post/rsyslog-loganalyzer-python/
- 版权声明:本作品采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可,非商业转载请注明出处(原文作者,原文链接),商业转载请联系作者获得授权。