(错误)记录的最佳实践

问题描述:

所以我试图为我的网络应用程序创建日志记录。它用前端的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

我建议在数据库中使用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中搜索。顺便记录使用归档类型数据库引擎。 –

如果在特定文件中的记录错误不能满足您的要求(在大多数情况下最好的方式),或者如果要将其保存在数据库中,那么不是为数据库中的每个字段创建许多列的好方法, 一个数据库的演示或简单的情况下,你应该保存在便携式格式的数据, 如果你不想再次查询数据,你可以编码整个消息在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; 
}