(错误)日志记录的最佳实践
Best Practises for (error-) logging
所以我正在尝试为我的网络应用程序创建日志记录。它使用 MariaDB 数据库,前端用 HTML/CSS/JS 编写,后端用 PHP 编写。我正在尝试在我的所有代码中为 error/warnings 等创建日志记录。这意味着,不仅是 PHP 代码,还有 JS(也许在未来甚至更多的语言)。
PHP 和 JS 中的大部分处理都已经完成,JS 错误通过 AJAX 发送到服务器。现在我坚持的是,将这些错误保存到数据库的最佳方法是什么。
现在我在数据库中有 1 个 table 错误,看起来像这样:
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)
注意:这与审计日志不同,审计日志是在不同的 table.
中实现的
澄清; message
只是一个单一的格式化字符串,它是从抛出的事件中创建的。这个字符串的几个真实例子是:
- php处理程序捕获到以下事件:2:mysqli::real_escape_string() 期望参数 1 为字符串,数组给定。文件:\path\to\the\databaseManager.php,行:206.
- ReferenceError:未定义 myfunc。文件:myFile.js 行:22 列:70
- php处理程序捕获到以下事件:8:未定义的索引:例程。文件:\path\to\the\Entrance.php,行:7.
但是,我无法(轻松地)从字符串中获取行号等。或者按文件名分组,看看哪些文件引起的麻烦最大。当然,添加文件名或行号等列可以解决此问题。但并非所有语言在发生错误时都会给出相同的信息。例如,JS 中的错误对象有列号、文件名、行号、浏览器名称等...但是 PHP 对所有这些的信息要少得多。而如果我以后要实现更多的(后端)语言,只会有更多的信息差异。
所以我的问题是,将错误保存到数据库的最佳做法是什么?每个(相似组)语言都有自己的table和各自的信息? 1 Table 有很多列?只保存基础知识,例如 file/line number severity?
此外,我可能忽略了上述解决方案的优缺点是什么?
我建议在您的数据库中使用 JSON 类型字段。
For more information about JSON type
您可以记录有关警告、错误等的详细信息。请注意将可查询字段存储为 table 中的字段。
为数据库中的每个字段创建很多列不是好方法,
如果在特定文件中记录错误不能让您满意(在大多数情况下是最好的方法),或者如果您想将其保存在数据库中以方便展示或简化,您应该以可移植格式保存数据,
如果您不想再次查询该数据,您可以在 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;
}
所以我正在尝试为我的网络应用程序创建日志记录。它使用 MariaDB 数据库,前端用 HTML/CSS/JS 编写,后端用 PHP 编写。我正在尝试在我的所有代码中为 error/warnings 等创建日志记录。这意味着,不仅是 PHP 代码,还有 JS(也许在未来甚至更多的语言)。 PHP 和 JS 中的大部分处理都已经完成,JS 错误通过 AJAX 发送到服务器。现在我坚持的是,将这些错误保存到数据库的最佳方法是什么。
现在我在数据库中有 1 个 table 错误,看起来像这样:
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)
注意:这与审计日志不同,审计日志是在不同的 table.
中实现的澄清; message
只是一个单一的格式化字符串,它是从抛出的事件中创建的。这个字符串的几个真实例子是:
- php处理程序捕获到以下事件:2:mysqli::real_escape_string() 期望参数 1 为字符串,数组给定。文件:\path\to\the\databaseManager.php,行:206.
- ReferenceError:未定义 myfunc。文件:myFile.js 行:22 列:70
- php处理程序捕获到以下事件:8:未定义的索引:例程。文件:\path\to\the\Entrance.php,行:7.
但是,我无法(轻松地)从字符串中获取行号等。或者按文件名分组,看看哪些文件引起的麻烦最大。当然,添加文件名或行号等列可以解决此问题。但并非所有语言在发生错误时都会给出相同的信息。例如,JS 中的错误对象有列号、文件名、行号、浏览器名称等...但是 PHP 对所有这些的信息要少得多。而如果我以后要实现更多的(后端)语言,只会有更多的信息差异。
所以我的问题是,将错误保存到数据库的最佳做法是什么?每个(相似组)语言都有自己的table和各自的信息? 1 Table 有很多列?只保存基础知识,例如 file/line number severity?
此外,我可能忽略了上述解决方案的优缺点是什么?
我建议在您的数据库中使用 JSON 类型字段。 For more information about JSON type
您可以记录有关警告、错误等的详细信息。请注意将可查询字段存储为 table 中的字段。
为数据库中的每个字段创建很多列不是好方法, 如果在特定文件中记录错误不能让您满意(在大多数情况下是最好的方法),或者如果您想将其保存在数据库中以方便展示或简化,您应该以可移植格式保存数据, 如果您不想再次查询该数据,您可以在 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;
}