supervisor+rsyslog+sentry日志管理

使用supervisor+rsyslog+sentry进行日志管理配置方法

首先我想说,真他么太折腾了,终于搞定了,尼玛啊啊啊啊啊啊啊啊啊啊啊啊!为了折腾这个差不多花了一个星期的时间,从最开始的syslog开始,完全不了解,文章又少,我连俄语文章都拜读了啊,太佩服自己了,用英语提了下问,结果没人鸟,刚开始看的时候,感觉文章都是一堆天书,机器上也根本没有syslog,折腾了几天知道了rsyslog的基本使用,才发现自己的os尼玛syslog有问题根本就不记录,到处折腾不好,都想放弃了,期间又重装系统,必须感谢胡哥,陪我一起解决问题,一起研究rsyslog的用法,给我刻盘,昨晚1点了我都打算睡了还来敲门说他知道不能上传日志到sentry是什么原因了,1点了啊早上7点起床有么有啊,我穿条内裤又跑去他寝室看是咋回事,我看他也困的不行,说话声音都沙了,辛苦了。好基友,一被子啊!草!

环境:

Sentry Server:ubuntu 12.04 desktop(192.168.1.101)Test PC:ubuntu 12.04 desktop(192.168.1.106)

在产生日志的机器(Test PC)上安装Supervisor:
$ sudo pip install supervisor
配置Supervisor:

首先需要使用echo_supervisord_conf命令生成配置文件

# echo_supervisord_conf > /etc/supervisord.conf

或者:

$ echo_supervisord_conf |sudo tee /etc/supervisord.conf

配置文件可以自行指定文件所在位置,/etc/supervisord.conf是supervisor会默认查找的位置,报错信息中可以查看到还有其他几个路径也是默认位置。

按照conf文件示例内容修改配置,添加监控任务。其中;为注释

[program:THE_PROGRAM_NAME]
command=COMMAND_TO_RUN_THE_PROGRAM
autorestart=true
stdout_logfile=syslog
redirect_stderr=true

THE_PROGRAM_NAME为要监控的程序名称,可随意设置,会在syslog日志中显示

COMMAND_TO_RUN_THE_PROGRAM为启动这个被监控程序的命令,自动重启时用到

stdout_logfile的值设置为特殊值syslog,否则会以此值为本地文本文件名保存

配置好后启动supervisor:

# supervisord
修改产生日志机器上的rsyslog配置:

在/etc/rsyslog.d/下新建你的xxx.conf文件,内容为:

$SystemLogUsePIDFromSystem on
if $programname == 'supervisord' then @@192.168.1.101:10514;RSYSLOG_SyslogProtocol23Format

便会将supervisor产生的日志用tcp方式发送到Sentry Server的10514端口


Sentry Server上安装Sentry:

PS:因为sentry依赖django,且最新版必须依赖1.5.1以上版本,本地如果有django环境请使用virtualenv安装。

$ virtualenv --no-site-packages venv
$ cd venv/
$ source bin/activate
$ pip install sentry
$ pip install loggerglue
$ pip install MySQL-python #虚拟环境没有mysql,sentry默认是sqlite,要用到mysql需要安装上,安装mysql-python报错的话检查mysql-server mysql-client libmysqlclient15-dev python-dev等是否安装
配置Sentry

生成默认路径的配置文件:

$ sentry init  #--config自定义文件名
Configuration file created at '/home/ashin/.sentry/sentry.conf.py'

修改配置sentry.conf.py:

SENTRY_URL_PREFIX的值设置为什么那么Sentry的访问地址就必须是什么,如以localhost为例,设置为'http://localhost:9000'那么浏览器访问就必须是http://localhost:9000 ,而不能使用http://127.0.0.1:9000 进行访问。其他配置和Django的settings.py类似。

运行Sentry:

$ sentry start #--config自定义文件名

如果是在Running service: 'http'时报错 [ERROR] Connection in use: ('0.0.0.0', 9000),请检查9000端口是否被占用。

如果报错:SuspiciousOperation: Invalid HTTP_HOST header (you may need to set ALLOWED_HOSTS): localhost:9000,需要在settings中配置ALLOWED_HOSTS=['localhost']。

访问web界面,登陆后按步骤设置下后会生成一个dsn key

测试下是否配置成功:raven test <DSN_KEY>

Sentry Server上运行Bridge to send rsyslog logs to sentry

使用https://gist.github.com/avoine/2912777/raw/c5f151fe701d58c33120118daa87c8cee95a7a46/gistfile1.py 插件,修改其中的dsn和监听ip,当Test PC发送syslog到Sentry Server的10514端口时,该脚本通过监听10514端口,通过handler调用raven的api将日志内容发送到sentry

import logging

from raven import Client
from loggerglue.server import SyslogServer, SyslogHandler

client = Client(dsn='http://5d8f03027e9e413484d4ce4a9281e4bc:6e5a92d69a8e44b8a93f074db61e6920@localhost:9000/2') #自己sentry的api key

PRIVAL_SEVERITY = {
    0 : logging.CRITICAL,
    1 : logging.CRITICAL,
    2 : logging.CRITICAL,
    3 : logging.ERROR,
    4 : logging.WARNING,
    5 : logging.INFO,
    6 : logging.INFO,
    7 : logging.DEBUG,
}

PRIVAL_FACILITY = {
    0 : "LOG_KERN",
    1 : "LOG_USER",
    2 : "LOG_MAIL",
    3 : "LOG_DAEMON",
    4 : "LOG_AUTH",
    5 : "LOG_SYSLOG",
    6 : "LOG_LPR",
    7 : "LOG_NEWS",
    8 : "LOG_UUCP",
    9 : "LOG_CRON",
    10 : "LOG_AUTHPRIV",
    16 : "LOG_LOCAL0",
    17 : "LOG_LOCAL1",
    18 : "LOG_LOCAL2",
    19 : "LOG_LOCAL3",
    20 : "LOG_LOCAL4",
    21 : "LOG_LOCAL5",
    22 : "LOG_LOCAL6",
    23 : "LOG_LOCAL7",
}

def prival(prival):
    sev_num = prival % 8
    fac_num = (prival - sev_num) / 8
    return (PRIVAL_SEVERITY[sev_num], PRIVAL_FACILITY[fac_num])

class SimpleHandler(SyslogHandler):
    def handle_entry(self, entry):
        level, fac = prival(entry.prival)
        client.name = entry.hostname

        data = {'level': level, "culprit" : ".".join([fac, entry.app_name]),
                'logger' : ".".join([fac, entry.app_name])}

        client.capture('Message', message=entry.msg,
                            date=entry.timestamp, data=data)

s = SyslogServer(('192.168.1.101', 10514), SimpleHandler) #  rsyslog->10514->handler->sentry
s.serve_forever()

这样在Test PC上由supervisor产生的日志就会通过rsyslog发送给这个脚本,这个脚本再统一发给Sentry,最后同样的方法将Sentry和该脚本也加入到supervisor中进行监控。

详细参考:

http://ashin.sinaapp.com/article/139/
http://ashin.sinaapp.com/article/143/
http://ashin.sinaapp.com/article/144/
http://ashin.sinaapp.com/article/145/
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值