(错误)日志记录的最佳实践
因此,我尝试为我的 Web 应用创建日志记录。前端使用 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:未定义索引:routine。文件:\path\to\the\Entrance.php,行:7。
但是,我无法(轻松地)从字符串中获取行号等信息。或者按文件名分组,查看哪些文件导致的问题最多。当然,添加文件名或行号等列可以解决此问题。但并非所有语言在发生错误时都会给出相同的信息。例如,JS 中的错误对象具有列号、文件名、行号、浏览器名称等...但 PHP 拥有的关于所有这些的信息要少得多。如果我将来想实现更多(后端)语言,信息差异只会更大。
所以我的问题是,将错误保存到数据库的最佳实践是什么?每种( 相似 的组)语言都有自己的表,其中包含相应的信息?1 个包含很多列的表?仅保存基本信息,例如文件/行号严重性?
此外,我可能忽略了上述解决方案的哪些优缺点?
我建议在你的数据库中使用 JSON 类型的字段。 有关 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;
}