实战Sentry

不管你用什么编程语言,都会面临如何处理错误日志的问题。很多程序员对错误日志放任自流,直到出现故障了才追悔莫及,如果问我怎么办,我会推荐 Sentry

Sentry 是一个错误记录和聚合的平台,只要看看它漂亮的界面就会喜欢上它:

sentry

sentry

关于如何安装 Sentry,官方文档里已经给出了详细的说明,建议大家仔细阅读,一般通过 Virtualenv 来安装 Sentry,具体可以参考:学习搭建Python环境

提醒:我在安装 7.5 的时候,测试有循环重定向,如果你也是可以安装 7.4:

pip install sentry==7.4.3

安装完毕后,假设我们要监控 PHP 错误日志,那么通常是在我们的业务代码里嵌入官方的 PHP SDK,不过这样肯定会影响到性能,好在我们可以通过错误日志曲线救国,只要定期扫描错误日志,把新生成的数据发送给 Sentry 就好了。

更新:我现在觉得原来的做法太吹毛求疵了,其实 Sentry 本身提供了 async 的调用方法,比如在 PHP SDK 里,只要设置 curl_method 为 async 或者 exec 即可。

如果发现 Sentry 中的错误计数器始终是一,即便有新的错误也不更新,那么多半是因为没有权限生成 celerybeat-schedule 文件,缺省是生成在进程的 cwd 目录中。

如何才能发现新生成的数据呢?需要记录扫描到了哪个位置,可以通过 Logcheck 中提供的 logtail 或者 logtail2 来实现这个功能,至于它俩的区别,可以参见 man 文档,简单点儿说,logtail 在启用文件被 rotate 的时候可能会丢数据,而 logtail2 不会。

array( 'php\_version' => phpversion(), ), 'trace' => false, ); $pattern\_content = '^\\\[(\[^\]\]+)\] PHP (\[^:\]+):\\s+(.+)'; $parrern\_level = implode('|', array( 'debug', 'info', 'warning', 'error', 'fatal', )); $client = new Raven\_Client($dsn, $options); while (($line = fgets(STDIN)) !== false) { if (!preg\_match("/{$pattern\_content}/", $line, $match)) { continue; } list($line, $timestamp, $level, $message) = $match; $timestamp = gmdate('Y-m-d\\TH:i:s\\Z', strtotime($timestamp)); preg\_match("/{$parrern\_level}/i", $level, $match); $level = isset($match\[0\]) ? $match\[0\] : 'error'; $client->captureMessage($message, array(), array( 'timestamp' => $timestamp, 'level' => $level, )); } ?>

做好了以上这些准备工作,剩下的只要通过管道把新数据传递给 PHP 脚本即可:

shell> logtail -f /path/to/php/error/log | php /path/to/script

建议通过 crontab 定时运行,同时用 flock 保护一下。

首页 - Wiki
Copyright © 2011-2024 iteam. Current version is 2.125.1. UTC+08:00, 2024-05-18 10:18
浙ICP备14020137号-1 $访客地图$