【发布时间】:2018-03-27 00:51:49
【问题描述】:
所以我正在尝试为我的网络应用创建日志记录。它是用 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:未定义索引:例程。文件:\path\to\the\Entrance.php,行:7。
但是,例如,我不能(轻松)从字符串中获取行号。或者按文件名分组,看看哪些文件最麻烦。当然,添加文件名或行号之类的列可以解决此问题。但并非所有语言在发生错误时都会给出相同的信息。例如,JS 中的错误对象有列号、文件名、行号、浏览器名称等……但 PHP 对这一切的信息要少得多。而如果我以后想实现更多的(后端)语言,只会有更多的信息差异。
所以我的问题是,将错误保存到数据库的最佳做法是什么?每种(相似组)语言都有自己的表格和各自的信息? 1 有很多列的表?只保存基本信息,例如文件/行号严重性?
另外,我可能忽略了上述解决方案的一些优点和缺点?
【问题讨论】:
-
在我看来就像某种 yagni ...谁会在什么用例中使用(阅读)这张表。其他选项可用,尽量不要自己滚动。
-
我会查看 Sentry 的 PHP 客户端,它会抓取相邻的源代码和堆栈本地变量:github.com/getsentry/sentry-php。对于 JS,您可能需要考虑不同的浏览器如何具有细微的不同堆栈跟踪。 Sentry 的 JS 客户端也可以在这里提供帮助 github.com/getsentry/raven-js
标签: javascript php error-handling error-logging