PHP Monolog不以ISODate格式存储日期时间

时间:2015-09-08 14:24:19

标签: php mongodb datetime monolog mongodate

PHP IDS系统expose使用Monolog将日志存储到MongoDB中。以下是它存储日志的方式:

{
  "message": "Executing on data 4f2793132469524563fa9b46207b21ee",
  "context": [

  ],
  "level": NumberLong(200),
  "level_name": "INFO",
  "channel": "audit",
  "datetime": "1441721696",
  "extra": [

  ]
}

我想在Mongo中使用自动删除功能,我需要datetime字段以ISOdate格式存储,如下所示:

"datetime":ISODate("2015-09-08T17:43:25.678Z")

我查看Mongo中的课程\Expose\Log\Mongo();,这是负责以秒格式存储datetime的部分

public function log($level, $message, array $context = array())
{
    $logger = new \Monolog\Logger('audit');
    try {
        $handler = new \Monolog\Handler\MongoDBHandler(
            new \MongoClient($this->getConnectString()),
            $this->getDbName(),
            $this->getDbCollection()
        );
    } catch (\MongoConnectionException $e) {
        throw new \Exception('Cannot connect to Mongo - please check your server');
    }
    $logger->pushHandler($handler);
    $logger->pushProcessor(function ($record) {
        $record['datetime'] = $record['datetime']->format('U');            

        return $record;
    });

    return $logger->$level($message, $context);
}

我已将$ record ['datetime']更改为此

//$record['datetime'] = $record['datetime']->format('U');
$record['datetime'] =  new \MongoDate();;

但是时间不存储为ISOdate但是:

"datetime": "[object] (MongoDate: 0.84500000 1441721683)"

有人能告诉我如何以ISODate格式存储datetime吗?

1 个答案:

答案 0 :(得分:0)

我在Symfony2配置上遇到了同样的问题。我解决了设置一个基本上什么也没做的自定义格式化程序。它在我的情况下工作得很好,因为我只存储了标量的东西,唯一的例外是 MongoDate 没有格式化。所以你可能需要做一些调整。

这是自定义格式化程序:

<?php

namespace AppBundle\Service\Formatter;

use Monolog\Formatter\FormatterInterface;

/**
 * Class MongoLoggerFormatter
 *
 * @package AppBundle\Service
 * @author  Francesco Casula <fra.casula@gmail.com>
 */
class MongoLoggerFormatter implements FormatterInterface
{
    /**
     * {@inheritdoc}
     */
    public function format(array $record)
    {
        return $record;
    }

    /**
     * {@inheritdoc}
     */
    public function formatBatch(array $records)
    {
        return $records;
    }
}

这是我的异常监听器的摘录:

/**
 * @return \Symfony\Bridge\Monolog\Logger
 */
public function getLogger()
{
    return $this->logger;
}

/**
 * @return \Monolog\Handler\HandlerInterface|null
 */
private function getMongoHandler()
{
    foreach ($this->getLogger()->getHandlers() as $handler) {
        if ($handler instanceof MongoDBHandler) {
            return $handler;
        }
    }

    return null;
}

/**
 * @return \Monolog\Handler\HandlerInterface|null
 */
private function addDefaultMongoHandlerSettings()
{
    $mongoHandler = $this->getMongoHandler();

    if ($mongoHandler) {
        $mongoHandler->setFormatter(new MongoLoggerFormatter());
        $mongoHandler->pushProcessor(function (array $record) {
            $record['created_at'] = new \MongoDate(time());

            return $record;
        });
    }

    return $mongoHandler;
}
相关问题