Ste*_*han 5 php logging json pretty-print
我在php中构建一个API.此API处理来自第三方API的json消息.
我想记录无效的漂亮打印的json消息.
所以我这样做了:
error_log("test\n" . json_encode($json_string, JSON_PRETTY_PRINT));
Run Code Online (Sandbox Code Playgroud)
但是,当我查看我的日志时,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\"}"
Run Code Online (Sandbox Code Playgroud)
我希望看到类似的东西:
$ tailf error.log
2015-07-13 10:20:03: (mod_fastcgi.c.2701) FastCGI-stderr: test
{
"info": {
"status": 200,
"msg ": "OK"
},
"response": {
"foo": "bar"
}
}
Run Code Online (Sandbox Code Playgroud)
我怎么能得到这个结果?
TRi*_*RiG 13
error_log("test\n" . json_encode($json_string, JSON_PRETTY_PRINT));
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
如果可能的话,最好将JSON_PRETTY_PRINT标志添加到$json_string最初的位置,而不是将其转换回PHP数组然后再返回到JSON .
或者,只需$json_string直接记录(不需要对其进行编码:它已经是一个字符串,您可以将其error_log()原样传递给它),并且只有在需要读取日志时才会担心它会被美化.这将使您的日志相当小.
| 归档时间: |
|
| 查看次数: |
9260 次 |
| 最近记录: |