實戰Sentry

jopen 9年前發布 | 41K 次閱讀 Sentry 項目/任務管理

 

不管你用什么編程語言,都會面臨如何處理錯誤日志的問題。很多程序員對錯誤日志放任自流,直到出現故障了才追悔莫及,如果問我怎么辦,我會推薦 Sentry

Sentry 是一個錯誤記錄和聚合的平臺,只要看看它漂亮的界面就會喜歡上它:

實戰Sentry

sentry

關于如何安裝 Sentry, 官方文檔 里已經給出了詳細的說明,建議大家仔細閱讀,一般通過 Virtualenv 來安裝 Sentry,具體可以參考:學習搭建Python環境。

提醒:我在安裝 7.5 的時候,測試有循環重定向,如果你也是可以安裝 7.4:

pip install sentry==7.4.3

安裝完畢后,假設我們要監控 PHP 錯誤日志,那么通常是在我們的業務代碼里嵌入官方的 PHP SDK ,不過這樣肯定會影響到性能,好在我們可以通過錯誤日志曲線救國,只要定期掃描錯誤日志,把新生成的數據發送給 Sentry 就好了。

如何才能發現新生成的數據呢?需要記錄掃描到了哪個位置,可以通過 Logcheck 中提供的 logtail 或者 logtail2 來實現這個功能,至于它倆的區別,可以參見 man 文檔,簡單點兒說,如果日志被 rotate 的話,logtail 可能會丟失舊日志中的數據,而 logtail2 不會。

<?php
require_once __DIR__ . '/raven-php/lib/Raven/Autoloader.php';
Raven_Autoloader::register();
$dsn = 'http://your/dsn';
$options = array(
  'tags' => 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;
  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> logtail2 -f /path/to/php/error/log | php /path/to/script

建議通過 crontab 定時運行此命令,但是需要注意用 flock 保護一下,以免擁堵。

參考鏈接: 在生產環境部署sentry進行錯誤收集和提醒

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!