(错误)记录的最佳实践

时间:2017-10-15 11:14:58

标签: javascript php error-handling error-logging

所以我尝试为我的网络应用创建日志记录。它使用MariaDB数据库以HTML / CSS / JS编写前端,PHP编写后端。我试图在我的所有代码中创建错误/警告等日志记录。这意味着,不仅是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,Line:206。
  • ReferenceError:未定义myfunc。文件:myFile.js行:22栏:70
  • phpHandler捕获了以下事件:8:未定义的索引:例程。文件:\ path \ to \ the \ Entrance.php,Line:7。

但是,我不能(轻松)抓住字符串中的行号。或者按文件名分组,看看哪些文件最麻烦。当然,添加像文件名或行号这样的列可以解决这个问题。但是,当发生错误时,并非所有语言都提供相同的信息。例如,JS中的错误对象具有列号,文件名,行号,浏览器名称等等......但是PHP在所有这些方面的信息较少。如果我希望将来能够实现更多(后端)语言,那么信息将会有更多差异。

所以我的问题是,将错误保存到数据库的最佳做法是什么?每个(类似的组)语言都有自己的表和各自的信息? 1表有很多列?只保存基础知识,如文件/行号严重性?

此外,我可能忽略了上述解决方案的一些优点和缺点?

2 个答案:

答案 0 :(得分:0)

这不是为数据库中的每个字段创建许多列的好方法, 如果特定文件中的日志记录错误不能满足您(在大多数情况下是最好的方式),或者如果您想在演示或简单的情况下将其保存在数据库中,则应以便携格式保存数据, 如果您不想再查询该数据,您可以在json(TEXT MESSAGE)中对整个消息进行编码(如果您有任何其他数据可以序列化)。例如

/**
 * @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;
}

答案 1 :(得分:-1)

我建议在数据库中使用JSON类型字段。 For more information about JSON type

您可以记录有关警告,错误等的详细信息。请注意将可查询字段存储为表格中的字段。