LoginSignup
8
8

More than 5 years have passed since last update.

Symfony2でカスタムログを取得

Posted at

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));
    }
}
8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8