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
吗?
答案 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;
}