DZ 自己有一套数据库报错拦截机制。
遵循只添加不修改的操作,我们仅在 discuz_error.php 文件中 添加回调拦截。通过在全局数据中传入回调函数,支持回调给多个注册方记录。
myhook(['_discuz_error' => 'system', 'message' => "{$message}\nPHP:{$logtrace}"]);
然后在你的入口处注册 myhook回调 这样就可以在数据库报错之前记录相关信息 便于后期拍错
数据库结构
CREATE TABLE `logs` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`domain` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '请求域名',
`ip` varchar(23) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '请求IP地址',
`action` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '行为',
`data` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '请求数据 ',
`headers` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '请求头',
`message` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '错误信息',
`user_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '报错用户',
`created_at` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '入库时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `user_id`(`user_id`) USING BTREE,
INDEX `domain`(`domain`) USING BTREE,
INDEX `created_at`(`created_at`) USING BTREE,
INDEX `ip`(`ip`) USING BTREE
) COMMENT = '报错信息日志记录' ;
PHP入库代码
C::t(PT_ERROR)->add([
'action' => INIT_GATE."/$mod/$ac",
'domain' => $_SERVER['HTTP_HOST'],
'ip' => ip(),
'data' => json_encode($_GET, JSON_UNESCAPED_UNICODE),
'headers' => json_encode(getallheaders(), JSON_UNESCAPED_UNICODE),
'user_id' => $_USER['uid'],
'message' => json_encode($params, JSON_UNESCAPED_UNICODE),
'created_at' => TIMESTAMP
]);