如何在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