
本文详解如何修正 php 日志类中无法输出 json 的问题,核心在于使用 json_encode() 将数组序列化为合法 json 字符串,并处理中文编码与文件写入细节。
本文详解如何修正 php 日志类中无法输出 json 的问题,核心在于使用 json_encode() 将数组序列化为合法 json 字符串,并处理中文编码与文件写入细节。
在您提供的 class.log.php 中,关键错误在于直接将 PHP 关联数组 $data 传给 fwrite():
fwrite($ofile, $data); // ❌ 错误:数组不能直接写入文件,会触发警告并写入 "Array" 字符串
PHP 不允许直接向文件写入数组变量——底层会将其强制转换为字符串 "Array",导致日志内容失效且非 JSON 格式。
✅ 正确做法是先调用 json_encode() 序列化数组,并启用 JSON_UNESCAPED_UNICODE 选项保留中文等 UTF-8 字符(避免 \uXXXX 转义):
fwrite($ofile, json_encode($data, JSON_UNESCAPED_UNICODE) . PHP_EOL);
此外,原代码还存在若干可优化点,建议一并修正:
✅ 完整修复版 class.log.php
<?php date_default_timezone_set('Europe/Istanbul');
class Log
{
public function add($uID, $pID, $text)
{
$date = date("d.m.Y H:i:s"); // 合并为单次调用,更高效
$data = [
"Date" => $date,
"UserID" => $uID,
"ProductID" => $pID,
"Text" => $text
];
$folder = "../log/";
$logFileName = $folder . date("d-m-Y") . ".log";
// 确保目录存在(含递归创建及权限设置)
if (!is_dir($folder)) {
mkdir($folder, 0755, true);
}
// 使用 file_put_contents 替代 fopen/fwrite,更简洁安全
$jsonLine = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . PHP_EOL;
file_put_contents($logFileName, $jsonLine, FILE_APPEND | LOCK_EX);
}
}
?>
⚠️ 注意事项
- 不要手动写 BOM:file_put_contents($logFileName, "\xEF\xBB\xBF") 会破坏 JSON 文件结构(JSON 规范禁止 BOM),应移除;
- 避免并发写入冲突:使用 FILE_APPEND | LOCK_EX 确保多进程/多请求下日志原子写入;
-
错误处理增强(生产环境推荐):
if (false === file_put_contents($logFileName, $jsonLine, FILE_APPEND | LOCK_EX)) { error_log("Failed to write log to {$logFileName}"); } - 日志可读性:每条记录末尾添加 PHP_EOL 换行,便于后续用 file() 或 json_decode(file_get_contents()) 逐行解析。
通过以上调整,您的 .log 文件将生成标准、可解析的 JSON 行格式(JSON Lines),例如:
{"Date":"05.04.2025 14:23:18","UserID":"41","ProductID":"16","Text":"Product Added"}
既满足结构化存储需求,也兼容现代日志分析工具(如 Logstash、jq 等)。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











