supervisor+rsyslog+sentry日志管理

来源:互联网 发布:微谱 知乎 编辑:程序博客网 时间:2024/05/01 13:35

使用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_PROGRAMautorestart=truestdout_logfile=syslogredirect_stderr=true

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

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

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

配置好后启动supervisor:

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

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

$SystemLogUsePIDFromSystem onif $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 loggingfrom raven import Clientfrom loggerglue.server import SyslogServer, SyslogHandlerclient = Client(dsn='http://5d8f03027e9e413484d4ce4a9281e4bc:6e5a92d69a8e44b8a93f074db61e6920@localhost:9000/2') #自己sentry的api keyPRIVAL_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->sentrys.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/
0 0