Sentry - 處理異常日誌的正確姿式

在各類系統和應用裏,不管你的代碼再完美也仍是會拋異常,出錯誤。今天的主角是當今比較流行的異常記錄框架 - Sentry,來了解一下。git

關於日誌管理

應用越作越複雜,輸出日誌五花八門,有print的,有寫stdout的,有寫stderr的, 有寫logging的,也有自定義xxx.log的。那麼這將致使平臺應用日誌分佈在各個地方,沒法統一管理。並且可能用的還不止一種開發語言,想規範和統一日誌不是一件容易的事。django

爲何使用Sentry

Sentry是一個集中式日誌管理系統。它具有如下優勢:編程

  • 多項目,多用戶
  • 界面友好
  • 能夠配置異常出發規則,例如發送郵件
  • 支持主流語言接口

從Sentry的文檔首頁截下來的一張圖,能夠看到它支持目前主流的編程語言。json

sentry-supported-platform

安裝和快速上手

Sentry支持部署到本地服務器,具體能夠參考如下文檔:服務器

但做爲大多數我的開發者和中小企業,我更建議使用Sentry官網(https://sentry.io/)提供的雲服務,你只須要註冊一個Sentry帳號,就能夠快速享受到集中處理異常日誌的服務。app

Sentry免費版能夠:框架

  • 每個月10k 錯誤日誌上限
  • 支持全部平臺和語言,功能無縮水
  • 無限項目數量,僅單用戶訪問,不提供團隊功能

具體的價格表能夠看這裏:編程語言

開始配置DSN

你能夠認爲 DSN(Data Source Name)是Sentry 管理項目須要的PROJECT_ID,每一個應用都須要對應一個 PROJECT_ID,以及用於身份認證的 PUBLIC_KEYSECRET_KEY。由此組成一個這樣的 DSN:工具

{PROTOCOL}://{PUBLIC_KEY}:{SECRET_KEY}@{HOST}/{PATH}{PROJECT_ID}

PROTOCOL 一般會是 http 或者 https,HOST 爲 Sentry 服務的主機名和端口,PATH 一般爲空。測試

在你登入Sentry後臺以後,你能夠新建一個項目,以後就能夠獲得相似於下面這樣一個DSN。

https://e055040d5@sentry.io/12345

有了DSN之後,你就能夠在客戶端中將錯誤日誌上傳到Sentry了。

配置客戶端

這裏我主要以Python爲例,其餘編程語言的客戶端配置能夠參考官網文檔,步驟大同小異。

首先經過pip安裝Sentry SDK。

pip install raven --upgrade

而後初始化客戶端。

from raven import Client

DSN = 'https://****@sentry.io/****'
client = Client(DSN)

最後,在你須要記錄異常的代碼爲止調用client.captureException()便可。

try:
    1 / 0
except ZeroDivisionError:
    client.captureException()

不少時候咱們的異常信息應該包含更多的上下文信息,這樣對於咱們作後續分析會有更多幫助,那麼你能夠在Sentry捕獲異常前加入這些上下文。

try:
    processing(user, data)

except:
    client.user_context({
        'user': user.email,
        'data': json.dumps(data)
    })
    client.captureException()

一些經驗之談

固然,咱們不可能在每處可能發生異常的代碼爲止都調用Sentry,也不可能去修補過去的代碼將Sentry一一植入,一個好的建議是,不管什麼時候,你的程序都有統一的異常處理機制,最好是全局的。這樣的話,你只要將Sentry寫在全局的異常處理器便可。

另外Sentry還對流行的開發框架提供了特別的支持,好比Flask,Django等等,在這些應用中你只要配置就行,不須要你去寫什麼全局的異常處理(雖然寫起來也不難)。

Flask的例子:

sentry = Sentry(dsn='http://public_key:secret_key@example.com/1')

def create_app():
    app = Flask(__name__)
    sentry.init_app(app)
    return app

Django的例子:

import os
import raven

INSTALLED_APPS = (
    'raven.contrib.django.raven_compat',
)

RAVEN_CONFIG = {
    'dsn': 'http://public_key:secret_key@example.com/1',
    # If you are using git, you can also automatically 
    # configure the release based on the git info.
    'release': raven.fetch_git_sha(os.path.abspath(os.pardir)),
}

異常報告和提醒

一旦你完成上面的配置,之後系統發生的全部錯誤異常都會被自動記錄到Sentry,查看報告就是一件輕鬆愉快的事情了。

默認狀況下,一旦異常發生,5分鐘內就會有一封郵件送到你郵箱,包含了異常信息的大體描述。

sentry-email-alert

固然你還能夠將異常報警集成到更多系統中,好比HICHAT,SLACK,IRC,WEBHOOKS,在Sentry後臺提供了相應的入口。

在Sentry的項目 Dashboard 你能夠瀏覽到更詳細的報告,好比按照異常信息的類別進行分類和過濾,也能夠統計近期異常的狀態和頻率,很是方便。

sentry-dashboard

Sentry還提供了異常信息的聚合,一樣的錯誤有可能在多處拋出,傳統的日誌統計起來就不是很方便,在Sentry一目瞭然。

另外你還能夠針對異常問題進行分配和跟蹤,例如指派團隊的某個成員去處理某一類問題,對於長時間沒有再發生的問題自動標記爲解決等等。

總結

Sentry 還有有不少亮點,好比敏感信息過濾, release 版本跟蹤,關鍵字查找,受影響用戶統計,權限管理等。Sentry 的 plugin 模塊還能夠集成大量的第三方工具如: SLACK , JIRA 。

對咱們來講最大的便利就是利用日誌進行錯誤發現和排查的效率變高了。可是,咱們能不能徹底依賴Senry呢?有幾點值得探討:

不是日誌的替代品

Sentry 的目的是爲了讓咱們專一於系統與程序的異常信息,目的是提升排查問題的效率,日誌事件的量到達一個限制時甚至丟棄一些內容。官方也提倡正確設置 Sentry 接收的日誌 level 的同時,用戶也能繼續舊的日誌備份。

不是排查錯誤的萬能工具

Sentry 是帶有必定策略的問題分析工具,以樣本的形式展現部分原始日誌的信息。信息不全面的同時,使用過程當中也可能出現 Sentry 聚合所帶來的負面影響,特別是日誌記錄質量不夠的狀況下。

不是傳統監控的替代品

與傳統的監控系統相比,Sentry 更依賴於發出的日誌報告,而另一些隱藏的邏輯問題或者業務問題極可能是不會獲得反饋的。

參考文檔

關於做者:

Toby Qin, Python 技術愛好者,目前從事測試開發相關工做,轉載請註明原文出處。

歡迎關注個人博客 https://betacat.online,你能夠到個人公衆號中去當吃瓜羣衆。

Betacat.online

相關文章
相關標籤/搜索