Sentry简介

来源:互联网 发布:linux 虚拟机不能上网 编辑:程序博客网 时间:2024/06/06 03:36

综述

sentry是一个优秀的日志搜集框架。在程序员编程的过程中,错误是不可避免的,由此产生的错误日志也就非常重要,sentry就是一个用来搜集这些错误日志的框架。
sentry界面
sentry的特点是支持许多语言。想象一下,java,nodejs,js,c++。。。各种语言的错误日志信息都一起出现,该如何处理?sentry提供了对于各种语言的支持,方便用户的使用,具体的支持可以去sentry的文档中心查看。https://docs.sentry.io/
实习的时候做的是基于java,scala和nodejs的,这里主要介绍基于Java的。

安装

sentry的安装有基于docker和基于python

基于docker

基于docker的安装比较简单,直接按照文档安装即可

基于python

基于python的安装比较复杂,在实习的时候做的就是基于python的安装,这里做个简单的叙述。

依赖环境

  • linux
  • python2.7
  • pip8.1以上
  • 如下组件
    python-setuptools, python-dev, libxslt1-dev, gcc, libf-dev, libjpeg-dev,
    libxml2-dev, libxslt-dev, libyaml-dev, libpq-dev
  • redis
  • postgresql-9.5

安装postgresql

  • 命令行安装postgresql
sudo apt-get install postgresql

在 Ubuntu 下安装 Postgresql 后,会自动添加一个名为 postgres 的操作系统用户,密码是
随机的。并且会自动生成一个名字为 postgres 的数据库,用户名也为 postgres,密码也是
随机的
- 修改postgres密码

// 打开客户端工具(psql)sudo -u postgres psql// 在客户端中修改密码ALTER USER postgres WITH PASSWORD '123456';// 修改完成,退出客户端postgres=# \q

修改postgres用户密码

修改ubuntu操作系统的postgres用户的密码(密码要与数据库用户 postgres 的密码
相同)

// 切换到 root 用户su root// 删除 PostgreSQL 用户密码sudo passwd -d postgres// 设置 PostgreSQL 系统用户的密码sudo -u postgres passwd// 在这里输入更新的密码

修改 PostgresSQL 数据库配置实现远程访问

这里需要修改两个配置文件:postgresql.conf 和 pg_hba.conf,都在 postgresql 的安装路
径下

// 修改 postgresql.confvim /etc/postgresql/9.5/main/postgresql.conf// 监听任何地址访问,修改连接权限#listen_addresses = 'localhost' 改为 listen_addresses = '*'// 启用密码验证#password_encryption = o 改为 password_encryption = o// 修改 pg_hba.confvim /etc/postgresql/9.5/main/pg_hba.conf// 在文档末尾加上以下内容host all all 0.0.0.0 0.0.0.0 md5// 然后重启/etc/init.d/postgresql restart

设置防火墙

// 设置 5432 为 postgreSQL 默认的端口iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 5432 -j ACCEPT

安装redis

直接安装

配置和安装sentry

一般sentry安装在/www/sentry路径下,sentry的配置文件在/etc/sentry路径下
在sentry的安装目录中启动虚拟环境

pip install -U sentry// 初始化配置sentry init /etc/sentry

这时候会在/etc/sentry 下产生两个配置文件,sentry.conf.py 和 confg.yml
- 在sentry.conf.py中配置postgresql 的信息
需要注意的是密码要和postgres用户的登录密码相同

# ~/.sentry/sentry.conf.pyDATABASES = {'default': {'ENGINE': 'sentry.db.postgres','NAME': 'sentry','USER': 'postgres','PASSWORD': '','HOST': '','PORT': '',}}
  • 配置生成的密码
// 该语句生成一个密码sentry confg generate-secret-key// 添加密码SENTRY_OPTIONS['system.secret-key']= '上一步生成的密码
  • 运行和启动
// 在 postgresql 中创建名为 sentry 的数据库createdb -E utf-8 sentry// 初始化模式,这里也可以创建用户用于登录。// 如果提示 fe_sendauth: no password supplied,是因为在 sentry/sentry.conf.py 中的 password 一栏中没有填写密码。补充上设定的密码即可。SENTRY_CONF=/etc/sentry sentry upgrade// 在 postgresql 中创建名为 sentry 的数据库createdb -E utf-8 sentry// 初始化模式,这里也可以创建用户用于登录。// 如果提示 fe_sendauth: no password supplied,是因为在 sentry/sentry.conf.py 中的 password 一栏中没有填写密码。补充上设定的密码即可。SENTRY_CONF=/etc/sentry sentry upgrade

这里就可以运行sentry了

启动

  • 启动web服务
SENTRY_CONF=/etc/sentry sentry run web
  • 启动worker服务
SENTRY_CONF=/etc/sentry sentry run worker
  • 启动cron
SENTRY_CONF=/etc/sentry sentry run cron

这时候可以在本机上访问 http://localhost:9000/,会出现如下画面
sentry安装成功

使用

这里用java程序作测试
下载java-raven
在java-raven中创建一个测试程序

package com.getsentry.bean;import org.apache.log4j.Logger;import org.apache.log4j.MDC;import java.text.SimpleDateFormat;import java.util.Date;public class RavenLog4j {    private static final Logger logger = Logger.getLogger(RavenLog4j.class);    public static void main(String[] args) {    int id = 0x01050001;    String logLevel = "INFO";        String date = "2017-04-19";        String user = "chenxy";        String messageInfo = "This is message test in event";        try{            int example = 1 / 0;        }catch (Exception e) {            logger.error("id | time | user exception!", e);        }    }    public static void logNormalMessage() {        try {            int example = 1 / 0;        } catch (Exception e) {            logger.error("id | time | user exception!", e);        }    }   public static void interfaceWithExtras(int id, String type, String logLevel, String user, String messageInfo) {       String jiffis = "";       String date = "";       Date nowTime = new Date(System.currentTimeMillis());       SimpleDateFormat sdFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");       date = sdFormatter.format(nowTime);        MDC.put("Id", id);        MDC.put("Date", date);        MDC.put("Type", type);       String strId = Integer.toString(id);       jiffis = String.valueOf(System.currentTimeMillis());       strId = "\n[" + strId + "]" + "[" + logLevel + "]";       strId = strId + "[" + System.currentTimeMillis() + "]";       strId = strId + "[" + date + "]";       strId = strId + "[" + user + "]";       messageInfo = strId + "[" + messageInfo + "]";       logger.error(messageInfo);    }    public static void interfaceWithExtras(int id, String type, String logLevel, String user, String messageInfo, Exception e) {        String jiffis = "";        String date = "";        Date nowTime = new Date(System.currentTimeMillis());        SimpleDateFormat sdFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        date = sdFormatter.format(nowTime);        MDC.put("Id", id);        MDC.put("Date", date);        MDC.put("Type", type);        String strId = Integer.toString(id);        jiffis = String.valueOf(System.currentTimeMillis());        strId = "\n[" + strId + "]" + "[" + logLevel + "]";        strId = strId + "[" + System.currentTimeMillis() + "]";        strId = strId + "[" + date + "]";        strId = strId + "[" + user + "]";        messageInfo = strId + "[" + messageInfo + "]";        logger.error(messageInfo, e);    }    public static void eventInterfaceWithExtras(int id, String logLevel, String user, String messageInfo){        String type = "event";        interfaceWithExtras(id, type, logLevel, user, messageInfo);    }    public static void eventInterfaceWithExtras(int id, String logLevel, String user, String messageInfo, Exception e){        String type = "event";        interfaceWithExtras(id, type, logLevel, user, messageInfo, e);    }    public static void logInterfaceWithExtras(int id, String logLevel, String user, String messageInfo){        String type = "log";        interfaceWithExtras(id, type, logLevel, user, messageInfo);    }    public static void logInterfaceWithExtras(int id, String logLevel, String user, String messageInfo, Exception e){        String type = "log";        interfaceWithExtras(id, type, logLevel, user, messageInfo, e);    }}

运行后就可在刚才打开的界面中看到错误信息,包括代码所属的包,错误时间,行数等信息,非常全面。

其他

Sentry目前用户类型有四种: 超级管理员, 管理员,普通用户和System agents. 超级用户只能通过命令行来创建,其他用户可以自己注册或由其他用户邀请注册加入,然后由超级管理员或管理员分配项目和权限。为了更好支持团队协助以及信息安全,新版本Sentry(5.4.2)经过了重新设计,重新设计后的Sentry以Team为中心组织权限。所谓Team就是一个团队,一些用户组织在一起对某些项目有操作权限的组织。一个项目只能属于一个Team, 一个用户却可以属于多个Team, 并可在不同Team中扮演不同角色, 如用户A在Team X是管理员而在Team Y中是System agents. Sentry对用户角色的指定只能到Team级别,不能到Project级别, 所以将某个用户加入到某个Team之后,这个用户就对所有所有属于这个Team下所有project有了相同的权限。
经过测试,sentry的性能还是可以的。sentry虽然是开源的,但是仍有收费版本,收费版会提供更长的历史记录,更多的用户等。
具体的收费标准请看官网介绍。

原创粉丝点击