使用Monolog记录整个数组

Rey*_*rPM 8 php symfony monolog symfony-2.6

有没有办法使用Monolog记录整个数组?我一直在阅读几个文档,但没有找到以可读格式记录整个数组的方法,任何建议?

我读过的文件:

Ugu*_*gur 11

如果检查记录器界面(https://github.com/php-fig/log/blob/master/Psr/Log/LoggerInterface.php),您将看到所有记录方法都以字符串形式显示消息,因此您将获得当您尝试使用字符串以外的变量类型进行日志记录时发出警告.

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

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

$logger->info(json_encode($array));
$logger->info(print_r($array, true));
$logger->info(var_export($array, true));
Run Code Online (Sandbox Code Playgroud)

另一方面,您可能希望在单个proccessor中格式化数组,以使用DRY原则集中格式化逻辑.

Json encode array -> Send as Json String -> json decode to array -> format -> json encode again

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在config.yml或services.yml中注册请求处理器,请参阅tags节点以注册自定义通道的处理器.

services:
monolog.formatter.session_request:
    class: Monolog\Formatter\LineFormatter
    arguments:
        - "[%%datetime%%] %%channel%%.%%level_name%%: %%message%%\n"

monolog.processor.session_request:
    class: Acme\WebBundle\CustomRequestProcessor
    arguments:  []
    tags:
        - { name: monolog.processor, method: processRecord, channel: testchannel }
Run Code Online (Sandbox Code Playgroud)

并在控制器中将您的数组记录为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');
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以根据需要在中央请求处理器中格式化和记录阵列,而无需在每个控制器中对阵列进行排序/格式化/行走.

  • 你们错过了这一点.Monolog的设计考虑了*结构化*记录.任何Monolog记录器方法的第一个参数都应该是一个简单的消息字符串 - 事实上,Monolog显式[将其转换为] [https://github.com/Seldaek/monolog/blob/master/src/Monolog/Logger .PHP#L427).但是,记录器方法**支持额外的`$ context`参数,它将在*消息之后打印*.所以,试试例如`$ logger-> info("My array",$ array);` (3认同)
  • 我刚刚花了两天时间试图弄清楚如何做到这一点。谢谢。在我看来,更好的解决方案是根本不使用独白。 (2认同)