部署 Sentry 日志管理服务

作者 huhamhire,暂无评论,2015年10月25日 16:25 折腾历程

一般在生产环境部署的项目,特别是集群部署的时候,想要监控生产环境的错误日志常常会变成一件比较麻烦的事情,所以就需要日志管理工具来对代码运行中的异常状况来进行监控跟踪。前段时间正好做到了项目上 node.js 服务端集群部署,找了个机会折腾了下 Sentry 这个日志集中管理工具。

Sentry 是一款基于 Django 实现的日志管理工具,Disqus 团队对其代码贡献不少。虽然 Sentry 本身是 Python 实现的,但是其日志监控功能却不局限于 python,对诸如 Node.js, php, ruby, C#, java 等语言的项目都可以做到无缝集成,甚至可以用来对 iOS, Android 移动客户端以及 Web 前端异常进行跟踪。加上比较现代的前台 UI(即将发布的 8.0 版本将开始用 react.js 框架构建前端元素),Sentry 算得上是比较不错的日志监控工具。

sentry

本次折腾依旧在 CentOS 7 环境下进行,Python 版本为 2.7,安装 Sentry 版本为当前 PyPI 中最新的 7.7 稳定版,建议使用 PostgreSQL 数据库,因为似乎在 8.0 版本中,MySQL 已经不再被官方支持。

安装 PostgreSQL 数据库服务

首先安装 PG 官方提供的 yum 源:


curl -O http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/pgdg-centos94-9.4-1.noarch.rpm
rpm -ivh pgdg-centos94-9.4-1.noarch.rpm

安装 PostgreSQL 数据库:


yum install postgresql94-server postgresql94-contrib -y

执行初始化:


/usr/pgsql-9.4/bin/postgresql94-setup initdb

配置系统服务并打开端口:


1 systemctl enable postgresql-9.4
2 systemctl start postgresql-9.4
3 
4 firewall-cmd --permanent --add-port=5432/tcp
5 firewall-cmd --reload

配置 PostgreSQL 管理员及 Sentry 应用账号,以及登录方式:


 1 SENTRY_USER="sentry"
 2 SENTRY_USER_PASS="password"
 3 SENTRY_DB="sentry"
 4 PG_ADMIN_PASS="password"
 5 
 6 su - postgres -c psql<<EOF
 7 \password postgres
 8 ${PG_ADMIN_PASS}
 9 ${PG_ADMIN_PASS}
10 
11 CREATE EXTENSION adminpack;
12 EOF
13 
14 su - postgres -c "createuser ${SENTRY_USER}"
15 su - postgres -c "createdb ${SENTRY_DB}"
16 
17 su - postgres -c "psql<<EOF
18 alter user ${SENTRY_USER} with encrypted password '${SENTRY_USER_PASS}';
19 grant all privileges on database ${SENTRY_DB} to ${SENTRY_USER};
20 EOF"
21 
22 sed -i "s/  ident/  password/" /var/lib/pgsql/9.4/data/pg_hba.conf
23 sed -i "s/^#listen_addresses = 'localhost'/listen_addresses ='*'/" /var/lib/pgsql/9.4/data/postgresql.conf
24 sed -i "s/^#port = 5432/port = 5432/" /var/lib/pgsql/9.4/data/postgresql.conf

注意修改其中的 password 为实际使用的密码。随后重启数据库服务,以使配置生效:


systemctl restart postgresql-9.4

安装 redis 服务

因为 Sentry 收集日志时,采用了先计入缓存,再写入数据库的方式进行持久化处理,这里就直接使用默认的 redis 来做缓存。


1 yum install -y redis
2 systemctl start redis.service
3 systemctl enable redis.service
4 
5 firewall-cmd --zone=public --add-port=6379/tcp --permanent
6 firewall-cmd --reload

安装 Sentry 服务

接下来,就开始正式的安装步骤。首先需要说明的是,官方推荐在 python 的 virtualenv 中部署 Sentry 环境,以避免对同服务器上其他 django 项目产生影响。不过由于我直接使用一台单独的虚拟机来部署 Sentry 服务,因而就简单处理,直接安装在系统环境中了。两者的仅区别在于服务启动时的 virtualenv 配置上。

首先是准备工作,安装依赖包,并添加服务进程用户:


1 yum update -y
2 yum install postgresql-devel libffi-devel openssl-devel libxml2-devel libxslt-devel zlib-devel
3 
4 mkdir -p /var/opt/sentry
5 
6 groupadd sentry
7 useradd sentry -d /var/opt/sentry -g sentry
8 passwd sentry

通过 pip 安装 Sentry:


1 pip install -U pip
2 pip install -U sentry
3 pip install -U sentry[postgres]

初始化默认的 Sentry 配置文件:


sentry init /var/opt/sentry/sentry.conf.py

编辑配置文件:


vim /var/opt/sentry/sentry.conf.py

修改相关配置,主要是数据库配置:


DATABASES = {
    'default': {
        'ENGINE': 'sentry.db.postgres',
        'NAME': 'sentry',
        'USER': 'sentry',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

SENTRY_ALLOW_REGISTRATION = False

初始化 Sentry 服务:


sentry --config=/var/opt/sentry/sentry.conf.py upgrade

创建管理员用户:


sentry --config=/var/opt/sentry/sentry.conf.py createuser

因为本身我只在内网使用,所以就直接使用默认端口访问,不再加一层反向代理,直接打开防火墙端口:


firewall-cmd --zone=public --add-port=9000/tcp --permanent
firewall-cmd --reload

接下来,安装 python 应用的 supervisord 守护进程:


pip install supervisor
echo_supervisord_conf  >/etc/supervisord.conf

修改默认配置文件:


vim /etc/supervisord.conf

添加 sentry 服务配置:


 1 [program:sentry-web]
 2 directory=/var/opt/sentry/
 3 environment=SENTRY_CONF=/var/opt/sentry/sentry.conf.py
 4 command=/usr/bin/sentry start
 5 autostart=true
 6 autorestart=true
 7 redirect_stderr=true
 8 stdout_logfile=syslog
 9 stderr_logfile=syslog
10 user=sentry
11 
12 [program:sentry-worker]
13 directory=/var/opt/sentry/
14 environment=SENTRY_CONF=/var/opt/sentry/sentry.conf.py
15 command=/usr/bin/sentry celery worker -B
16 autostart=true
17 autorestart=true
18 redirect_stderr=true
19 stdout_logfile=syslog
20 stderr_logfile=syslog
21 user=sentry

创建 supervisord 的 systemd 配置文件,将其注册为系统服务:


vim /etc/systemd/system/supervisord.service

写入配置内容:


 1 [Unit]
 2 Description=Supervisor daemon
 3 Documentation=http://supervisord.org
 4 After=network.target
 5 
 6 [Service]
 7 Type=forking
 8 PIDFile=/tmp/supervisord.pid
 9 ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf
10 ExecStop=/bin/kill -TERM $MAINPID
11 ExecReload=/bin/kill -HUP $MAINPID
12 
13 [Install]
14 WantedBy=multi-user.target

启动服务:


systemctl start supervisord
systemctl enable supervisord

此外,可以再配置上服务端定时清理的配置:


crontab -e

添加以下内容:


0 3 * * * sentry --config=/var/opt/sentry/sentry.conf.py cleanup --days=30

中文邮件发送失败的解决

可能是因为 Python 2 的缘故,这一版 Sentry 的邮件插件在邮件标题含有中文时会出现编码处理报错的情况,需要修改相关包内的代码实现:


vim /usr/lib/python2.7/site-packages/sentry/plugins/sentry_mail/models.py

进行如下修改:


-   subject='%s%s' % (subject_prefix, subject),
+   subject='%s%s' % (subject_prefix, unicode(subject, 'utf-8')),

修改完成后重启 Sentry 服务,使修改生效。

到这里,Sentry 服务端的配置工作就全部完成了,随后便可以通过 Web 端来访问 Sentry 服务并建立相关监控应用。具体项目中的集成配置,可在帮助文档中找到。

关键词:Django , Python , Sentry , 日志管理
登录后进行评论