Php 使用Monolog记录整个数组

Php 使用Monolog记录整个数组,php,symfony,monolog,symfony-2.6,Php,Symfony,Monolog,Symfony 2.6,有没有办法用Monolog记录整个数组?我已经阅读了好几篇文档,但没有找到一种方法以可读的格式记录整个阵列,有什么建议吗 我读过的文件: 如果您检查logger接口(),您将看到所有日志记录方法都以字符串形式获取消息,因此当您尝试使用字符串以外的变量类型进行日志记录时,会收到警告 我尝试使用处理器以自定义方式格式化数组,但正如预期的那样,在您将变量发送到logger接口后,会触发处理器 记录数组最肮脏的方式可能是您选择的任何一种方式 $logger->info(json_encod

有没有办法用Monolog记录整个数组?我已经阅读了好几篇文档,但没有找到一种方法以可读的格式记录整个阵列,有什么建议吗

我读过的文件:


如果您检查logger接口(),您将看到所有日志记录方法都以字符串形式获取消息,因此当您尝试使用字符串以外的变量类型进行日志记录时,会收到警告

我尝试使用处理器以自定义方式格式化数组,但正如预期的那样,在您将变量发送到logger接口后,会触发处理器

记录数组最肮脏的方式可能是您选择的任何一种方式

$logger->info(json_encode($array));
$logger->info(print_r($array, true));
$logger->info(var_export($array, true));
另一方面,您可能希望在单个处理器中格式化数组,以便使用DRY原则集中格式化逻辑

Json编码数组->作为Json字符串发送->Json解码到数组->格式->再次Json编码

CustomRequestProcessor.php

<?php
namespace Acme\WebBundle;


class CustomRequestProcessor
{


    public function __construct()
    {
    }

    public function processRecord(array $record)
    { 
        try {
            //parse json as object and cast to array
            $array = (array)json_decode($record['message']);
            if(!is_null($array)) {
                //format your message with your desired logic
                ksort($array);
                $record['message'] = json_encode($array);
            }
        } catch(\Exception $e) {
            echo $e->getMessage();
        }
        return $record;
    }
}
在控制器中,将数组记录为json字符串

<?php

namespace Acme\WebBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DefaultController extends Controller
{
    public function indexAction()
    {

        $logger = $this->get('monolog.logger.testchannel');
        $array = array(3=>"hello" , 1=>"world", 2=>"sf2");
        $logger->info(json_encode($array));

        return $this->render('AcmeWebBundle:Default:index.html.twig');
    }
}

我刚刚花了两天的时间试图弄清楚如何做到这一点。谢谢在我看来,一个更好的解决方案是根本不使用独白。我可以使用$logger->info(var_export($arrayName,true));,进行挖掘。虽然json_encode是个天才:)但你们没有抓住要点。Monolog的设计考虑了结构化日志记录。任何Monolog logger方法的第一个参数都应该是一个简单的消息字符串——事实上,Monolog是显式的。但是,记录器方法确实支持一个额外的
$context
参数,它将在消息之后打印该参数。例如,试试
$logger->info(“我的数组”,$array)@fuximusfee我同意。我刚从独白切换到使用好的旧
文件\u get\u contents()
文件\u APPEND
标志。@alexw这很有意义。。。您知道如何格式化
$context
的打印格式吗?默认情况下,它是单行字符串中的JSON,可读性不强。不确定StackOverflow为什么决定关闭此问题!答案如下:只需将LineFormatter与以下选项一起使用:
$formatter=newlineformatter(null、null、true、true)然后设置
$formatter->setJsonPrettyPrint(true)
然后像往常一样定义处理程序
$handler=newstreamhandler($path,$level)
并最终将格式化程序应用于处理程序:
$handler->setFormatter($formatter)。如果使用上下文参数
$logger->info(“短消息”,$anyArray)调用记录器
您将以可读的形式在日志中获得
$anyArray
:-)
<?php

namespace Acme\WebBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DefaultController extends Controller
{
    public function indexAction()
    {

        $logger = $this->get('monolog.logger.testchannel');
        $array = array(3=>"hello" , 1=>"world", 2=>"sf2");
        $logger->info(json_encode($array));

        return $this->render('AcmeWebBundle:Default:index.html.twig');
    }
}