用sentry管理PHP错误日志

Sentry是个很好用的错误日志服务器,可以将程序错误的详细情况集中捕获,并提供一个很漂亮的Web界面来浏览错误。
如果你还没用确定Sentry是否适合你,可以先试用Sentry的在线服务https://getsentry.com/welcome/
Sentry本身是用python写的,但它支持记录Python、PHP、Ruby、iOS、Javascript、Java、Node.js等多种语言的错误。
在浏览器中就可以查看项目的错误

Sentry 1

记录了错误调用栈信息,很快定位到错误

Sentry 2

记录了错误发生时浏览器信息,同时还可以记录自定义信息

Sentry 3

安装 Sentry

Sentry需要Python2.5以上版本。注意Sentry并不支持Python3。
$ sudo easy_install -UZ sentry
Sentry默认使用sqlite记录错误日志,生产环境下建议使用MySQL。使用以下命令安装Python的MySQL支持。

$ sudo easy_install -UZ sentry[mysql]

如果安装出错,可以用 sudo easy_install -UZ MySQL-python 命令直接安装Python的MySQL支持,
如果安装MySQL-python出错,安装下列安装包后在进行安装MySQL-python

sudo yum install python-devel
sudo yum install mysql-devel
sudo yum install libxslt-devel libxml2-devel

配置 Sentry

安装好之后使用以下命令建立配置文件:
$ mkdir ~/.sentry
$ sentry init ~/.sentry/sentry.conf.py
然后打开~/.sentry/sentry.conf.py,参照下边配置修改。

daemon: True, 使sentry以daemon模式运行。
sentry默认使用9000端口,我的9000端口已经被php-fpm占用,因此改用9111端口。
SENTRY_URL_PREFIX = ‘http://sentry:9111

SENTRY_WEB_HOST = '0.0.0.0'
SENTRY_WEB_PORT = 9111
SENTRY_WEB_OPTIONS = {
    'daemon':True,
    'workers': 3,  # the number of gunicorn workers
    'secure_scheme_headers': {'X-FORWARDED-PROTO': 'https'},
}

在mysql服务器上新建sentry数据库,修改mysql相关配置
DATABASES = {
‘default’: {
‘ENGINE’: ‘django.db.backends.mysql’,
‘NAME’: ‘sentry’,
‘USER’: ‘sentry’,
‘PASSWORD’: ‘sentry’,
‘HOST’: ‘192.168.100.1’,
‘PORT’: 3306,
}
}
修改好配置文件后,在用户根目录执行sentry start 启动服务器即可。第一次运行需要建立初始化数据,如新建管理员等操作,按照提示操作即可。
使用 sentry help查看更多使用方法。sentry send_fake_data 发生测试数据。
我在第一次启动sentry时遭遇下边的错误提示

DatabaseError: (1071, 'Specified key was too long; max key length is 1000 bytes')

产生这个错误的原因是我的MySQL数据库默认存储引擎是MyISAM。MyISAM存储引擎在创建索引的时候,索引键长度是有一个较为严格的长度限制的,所有索引键最大长度总和不能超过1000,而且不是实际数据长度的总和,而是索引键字段定义长度的总和。

sentry中有些表的索引键长度超过了1k,设置存储引擎为InnoDB即可解决问题。
连接mysql执行下面命令,设置默认存储引擎为InnoDB

SET global storage_engine=InnoDB;

使用Nginx作为前端代理服务器

location / {
  proxy_pass         http://sentry-ipaddress:9111;
  proxy_redirect     off;
  proxy_set_header   Host              $host;
  proxy_set_header   X-Real-IP         $remote_addr;
  proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
  proxy_set_header   X-Forwarded-Proto $scheme;
}

使用Sentry的PHP客户端

安装Raven-PHP

  1. Raven-PHP GitHub下载项目,把raven-php/lib/Raven复制到你的项目中
  2. 初始化Raven Cient

    require('/path/to/raven/Autoloader.php');
    Raven_Autoloader::register();
    $dsn = "https://96320c73c71946f2b1499b511a5311bf:ee9dcc397c354942b5295dd00c284e06@sentry:9111/2";
    $client = new Raven_Client();
    
  3. 设置PHP 错误处理的handler

    $error_handler = new Raven_ErrorHandler($client);
    set_error_handler(array($error_handler, 'handleError'));
    set_exception_handler(array($error_handler, 'handleException'));
    

以上代码有些fatal错误是无法记录的,详细原因见这里
下边是我为Codeigniter写的记录Log的Library。

相关资料

Sentry的官方文档 http://sentry.readthedocs.org/en/latest/
Sentry的PHP客户端 https://github.com/getsentry/raven-php
Sentry的Ruby客户端 https://github.com/getsentry/raven-ruby