2017-10-15 65 views
1

所以我試圖爲我的網絡應用程序創建日誌記錄。它用前端的HTML/CSS/JS和後端的PHP編寫,使用MariaDB數據庫。我試圖在我的所有代碼中爲錯誤/警告等創建日誌記錄。這意味着,不僅僅是PHP代碼,還有JS(也許將來會有更多的語言)。 PHP和JS中的大多數處理已經完成,JS錯誤通過AJAX發送到服務器。現在我遇到的問題是,將這些錯誤保存到數據庫的最佳方法是什麼?(錯誤)記錄的最佳實踐

現在我有在數據庫中的錯誤,它看起來像這樣1個表:

id   BIGINT (10) -- Primary Key 
message TEXT   -- The error message 
type  VARCHAR (255) -- warning/error/notice/deprication etc... 
origin  VARCHAR (255) -- JS/PHP etc... 
account_id BIGINT (10) -- Foreign Key to an account table 

c_dt DATETIME   -- Creation datetime 
u_dt DATETIME   -- Update datetime 
d_dt DATETIME   -- Delete datetime (implementation of soft delete) 

注意:這是不一樣的審計日誌,這是在不同的表來實現。

澄清; message只是一個單一的格式化字符串,它是從拋出的事件中創建的。此字符串的幾個實際的例子是:

  • phpHandler抓以下事件:2:的mysqli :: real_escape_string()預計參數1是字符串,數組給定。文件:\ path \ to \ the \ databaseManager.php,行:206.
  • ReferenceError:myfunc未定義。文件:myFile.js行:22列:70
  • phpHandler遇到以下事件:8:未定義的索引:例程。 File:\ path \ to \ the \ Entrance.php,Line:7.

但是,我不能(很容易)抓住,例如,字符串中的行號。或按文件名分組,看看哪些文件造成最大的麻煩。當然,添加文件名或行號等列將會解決這個問題。但是並不是所有的語言在發生錯誤時都會提供相同的信息。例如,JS中的錯誤對象具有列號,文件名,行號,瀏覽器名稱等等,但PHP在這方面的信息少得多。如果我想在未來實現更多(後端)語言,則只會有更多的信息差異。

所以我的問題是,將錯誤保存到數據庫的最佳做法是什麼?每個(組類似)語言自己的表與各自的信息? 1列有很多列?只保存基本信息,如文件/行號嚴重性?

此外,我可能忽略了上述解決方案的一些優點和缺點?

+0

看看[求助/上話題] – pvg

+0

我看來像某種** [YAGNI(HTTPS://en.wikipedia。org/wiki/You_aren%27t_gonna_need_it)** ...誰將使用(讀取)該表格,以何種用例。其他選項可用,儘量不要推出自己的。 – YvesLeBorg

+0

我想通過Sentry的PHP客戶端,它抓住相鄰的源和堆棧本地:https://github.com/getsentry/sentry-php。 對於JS,你可能想要考慮不同的瀏覽器有不同的棧跟蹤。 Sentry的JS客戶端也可以在這裏幫助https://github.com/getsentry/raven-js – ehfeng

回答

-1

我建議在數據庫中使用JSON類型字段。 For more information about JSON type

您可能會記錄有關您的警告,錯誤等的詳細信息。只是要小心地將可查詢字段作爲字段存儲在您的表中。

+0

不錯的建議!如果我錯了,請糾正我的錯誤,但實現如下?:當發生錯誤時,我將相關信息(通過where/what語言來定義)存儲在JSON中,並將JSON +類型存儲到DB 。然後檢索我從DB獲取JSON並根據類型確定,我以某種方式格式化它。 – OneBigOwnage

+0

不客氣。是的,你可以反序列化它的內容。但正如你所看到的,如果你需要,你可以在Json內容中搜索。 (SELECT JSON_SET('「x」','$ [0]','a');)。如果你真的需要在JSON中搜索。順便記錄使用歸檔類型數據庫引擎。 –

0

如果在特定文件中的記錄錯誤不能滿足您的要求(在大多數情況下最好的方式),或者如果要將其保存在數據庫中,那麼不是爲數據庫中的每個字段創建許多列的好方法, 一個數據庫的演示或簡單的情況下,你應該保存在便攜式格式的數據, 如果你不想再次查詢數據,你可以編碼整個消息在json(文本消息)(如果你有任何額外的數據,你可以序列化) 。例如

/** 
* @param $exception 
* @throws Exception 
*/ 
public function failed(Exception $exception) 
{ 
    YOUR_MODEL::save(
     [ 
      'error' => json_encode([ 
       "file" => $exception->getFile(), 
       "line" => $exception->getLine(), 
       "message" => $exception->getMessage() 
      ]) 
     ]); 

    throw $exception; 
}