(错误)记录的最佳实践
所以我试图为我的网络应用程序创建日志记录。它用前端的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列有很多列?只保存基本信息,如文件/行号严重性?
此外,我可能忽略了上述解决方案的一些优点和缺点?
我建议在数据库中使用JSON类型字段。 For more information about JSON type
您可能会记录有关您的警告,错误等的详细信息。只是要小心地将可查询字段作为字段存储在您的表中。
不错的建议!如果我错了,请纠正我的错误,但实现如下?:当发生错误时,我将相关信息(通过where/what语言来定义)存储在JSON中,并将JSON +类型存储到DB 。然后检索我从DB获取JSON并根据类型确定,我以某种方式格式化它。 – OneBigOwnage
不客气。是的,你可以反序列化它的内容。但正如你所看到的,如果你需要,你可以在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;
}
看看[求助/上话题] – pvg
我看来像某种** [YAGNI(HTTPS://en.wikipedia。org/wiki/You_aren%27t_gonna_need_it)** ...谁将使用(读取)该表格,以何种用例。其他选项可用,尽量不要推出自己的。 – YvesLeBorg
我想通过Sentry的PHP客户端,它抓住相邻的源和堆栈本地:https://github.com/getsentry/sentry-php。 对于JS,你可能想要考虑不同的浏览器有不同的栈跟踪。 Sentry的JS客户端也可以在这里帮助https://github.com/getsentry/raven-js – ehfeng