当前位置: 首页 > 未分类>阅读正文

php 记录最新200行sql错误日志

2022.7.30 朱丰华 56 次 留下评论 1766字

在sql连接工具中,sql执行异常时,自动记录sql,以及返回的错误消息。

每次先读取原记录,再把新记录从文件头添加到原记录中。

如果文件行数太多,直接截取一半(使用 substr_count 计算换行符 \n 的数量)

保存新记录到文件。

//debug状态下记录错误sql
$debug_file_name = BP3_ROOT . '/log/errorsql/0000_debugSql_latest.log';
$errMsg = "SQL:".$sql.PHP_EOL."MSG:".$msg.PHP_EOL."TIME:".date("Y-m-d H:i:s").PHP_EOL.PHP_EOL;
if(file_exists($debug_file_name)){
    $errMsg = $errMsg.file_get_contents($debug_file_name);
    //每超过多少行,就保留一半(防止文件变得越来越大)
    $line = substr_count($errMsg,"\n");
    if($line>200){
        $errMsg = substr($errMsg,0,strlen($errMsg)/2);
    }
}
file_put_contents($debug_file_name,$errMsg);

方法二:写到php文件中

写在php文件中,好处是不能直接下载(即使暴露外网地址),但因为存在在字符串变量,会把 ‘ 转换为 \’ ,不太友好。

//debug状态下记录错误sql(使用php文件,禁止用户下载)
$debug_file_name = BP3_ROOT . '/log/errorsql/0000_debugSql_latest.php';
if(file_exists($debug_file_name)){
    $errMsg = require($debug_file_name);
    if(count($errMsg)>100){
        $errMsg = array_slice($errMsg,0,50);
    }
}
$errMsg = $errMsg ?: array();
array_unshift($errMsg,array(
    'SQL:'=>$sql,
    'MSG:'=>$msg,
    'TIME'=>date("Y-m-d H:i:s")
));
$errMsgText = '<?php return ' . var_export($errMsg, true) . ';';
file_put_contents($debug_file_name,$errMsgText);

方法三:综合以上两种,仍为 php 文件,直接在文件头加 die;。

仍然是php文件,但是只有 die 的作用,格式是普通文本:

//debug状态下记录错误sql
$debug_file_name = BP3_ROOT . '/log/errorsql/0000_debugSql_latest.php';
$errMsg = "SQL:".$sql.PHP_EOL."MSG:".$msg.PHP_EOL."TIME:".date("Y-m-d H:i:s").PHP_EOL.PHP_EOL;
if(file_exists($debug_file_name)){
    $errMsg = $errMsg.file_get_contents($debug_file_name);
    //每超过多少行,就保留一半(防止文件变得越来越大)
    $line = substr_count($errMsg,"\n");
    if($line>200){
        $errMsg = substr($errMsg,0,strlen($errMsg)/2);
    }
}
$cus_head = "<?php die;?>"; //每次在文件头带上die;,禁止通过url访问该页面
$errMsg = $cus_head.PHP_EOL.$errMsg.PHP_EOL;
file_put_contents($debug_file_name,$errMsg);

方法四:给log目录设置密码保护。

php不能在代码中保护text,log目录,但可以给站点设置权限。

或者不把根目录作为站点的运行目录。

这种方法适合权限高的应用,一劳永逸,对于虚拟主机等就还是方法3比较好(方法二源码中显示\’,改进方向:配合程序直接在html中显示,则在页面中不会显示转移字符)。

本篇完,还有疑问?留下评论吧

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注