Symfony2では、Monologを通じてロギングすることができます。
デフォルトでは、本番環境の場合 app/logs/prod.log
へ出力されますが、別のファイルにログを出力したいときは、オリジナルのロガーを作成して、利用することができるようです。
たとえば、リクエストを受け付けてからレスポンスを返すまでの時間を計測して、パフォーマンスログを app/logs/prod.performance.log
に出力したい場合、
まずは、services.xmlにオリジナルのロガー Acme\DemoBundle\Logger\PerformanceLogger
を登録します。
services.xml
<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<parameters>
<parameter key="acme_demo.performance.logger.class">Acme\DemoBundle\Logger\PerformanceLogger</parameter>
<parameter key="acme_demo.performance.logger_handler.class">Monolog\Handler\StreamHandler</parameter>
</parameters>
<services>
<service id="acme_demo.performance.logger" class="%acme_demo.performance.logger.class%">
<argument>performance</argument>
<call method="pushHandler">
<argument type="service" id="acme_demo.performance.logger_handler" />
</call>
</service>
<service id="acme_demo.performance.logger_handler" class="%acme_demo.performance.logger_handler.class%">
<argument>%kernel.logs_dir%/%kernel.environment%.performance.log</argument>
</service>
</services>
</container>
Acme\DemoBundle\Logger\PerformanceLogger
は、Symfony\Bridge\Monolog\Logger
を継承し、必要なメソッドを追加します。
PerformanceLogger.php
<?php
namespace Acme\DemoBundle\Logger;
use Symfony\Bridge\Monolog\Logger;
class PerformanceLogger extends Logger
{
public function measure($startTime, $endTime)
{
$processTime = $endTime - $startTime;
$message = $processTime;
return $this->addRecord(self::INFO, $message, array());
}
}
あとは、コントローラーから呼び出すだけです。
DefaultController.php
<?php
namespace Acme\DemoBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
class DefaultController extends Controller
{
public function indexAction(Request $request)
{
// Start time
$startTime = microtime(true);
// Logging
$logger = $this->get('acme_demo.performance.logger');
$logger->measure($startTime, microtime(true));
}
}