阿小信大人的头像
Where there is a Python, there is a way. 阿小信大人

supervisor+rsyslog+sentry日志管理2014-09-02 06:47

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

环境:

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 #虚拟环境没有mysqlsentry默认是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中进行监控。

如果您觉得从我的分享中得到了帮助,并且希望我的博客持续发展下去,请点击支付宝捐赠,谢谢!

若非特别声明,文章均为阿小信的个人笔记,转载请注明出处。文章如有侵权内容,请联系我,我会及时删除。

#Python#  
分享到:
阅读[2814] 评论[0]

你可能也感兴趣的文章推荐

本文最近访客

发表评论