如何在PHP中记录漂亮的打印json?
我正在PHP中构建一个API。 该API处理来自第三方API的json消息。
我想记录无效的漂亮打印的json消息。
所以我这样做了:
error_log("testn" . json_encode($json_string, JSON_PRETTY_PRINT));
但是,当我查看我的日志时,json字符串并不漂亮:
$ tailf error.log
2015-07-13 10:20:03: (mod_fastcgi.c.2701) FastCGI-stderr: test
"{"info":{"status":200,"msg":"OK"},"response":{"foo":"bar"}"
我想看到像这样的东西:
$ tailf error.log
2015-07-13 10:20:03: (mod_fastcgi.c.2701) FastCGI-stderr: test
{
"info": {
"status": 200,
"msg ": "OK"
},
"response": {
"foo": "bar"
}
}
我怎样才能达到这个结果?
error_log("testn" . json_encode($json_string, JSON_PRETTY_PRINT));
json_encode()
实际上不一定会产生JSON:它会产生可以被javascript读取的东西。 如果你给它一个数组或对象,它会产生JSON; 如果你给它一个字符串,它会产生一个JavaScript字符串。 这就是你正在做的,所以这就是你所得到的。
要清楚的是, $json_string
是一个字符串:(就PHP而言,它是一个字符串;如果你将同一个字符串传递给javascript,它将被解释为一个对象)。 你通过json_encode()
传递,你将得到的是另一个字符串(一个双重编码的JSON字符串)。
JSON_PRETTY_PRINT
在这里没有任何作用,因为你不生产JSON:你正在生产的东西,JavaScript也会看作一个字符串。
精明?
因此,您需要做的是(a)将$json_string
重新转换为PHP数组,然后(b)将其重新编码为JSON,这次使用JSON_PRETTY_PRINT
标志。
$log_array = json_decode($json_string, true);
$json_pretty_string = json_encode($log_array, JSON_PRETTY_PRINT);
error_log('test' . PHP_EOL . $json_pretty_string);
如果可能的话,首先将JSON_PRETTY_PRINT
标志添加到JSON_PRETTY_PRINT
获得$json_string
的位置,而不是将其转换回PHP数组,然后返回到JSON。
或者,直接登录$json_string
(不需要对它进行编码:它已经是一个字符串,你可以直接将它传递给error_log()
),并且只在需要读取日志时才担心会对其进行优化。 这会使你的日志显得更小。
常见的unix错误日志不应该包含人类可读的json或其他非转义字符。 许多系统日志/日志实现受字符宽度限制,并自动添加编码(如"
)或删除新行字符,PHP的error_log也不是二进制安全的 - 遇到unicode字符时的行为是不可预知的(不确定)。
你不应该使用本机系统日志/错误日志功能,而是建立自己的记录器,专用于json日志记录。
我个人使用MongoDB来记录json,因为它是MongoDB应该使用的数据类型。
在这种情况下你有两种选择,
如果你可以使用像下面这样的str_replace:
error_log("testn" . str_replace('"',"n",json_encode($json_string, JSON_PRETTY_PRINT)));
或者像@Karoly Horvath说的:
您编码已经用JSON编码的字符串。 您的$ json_string已经被编码。 所以你需要解码你的第一个JSON并用良好的参数重新编码它
error_log("testn" . json_encode(json_decode($json_string), JSON_PRETTY_PRINT));
并赞扬@Karoly。
链接地址: http://www.djcxy.com/p/8275.html上一篇: How to log pretty printed json in PHP?
下一篇: JSON diff of large JSON data, finding some JSON as a subset of another JSON