使用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/