yasutomogのブログ

Software Engineerの雑記

lumenのログ出力制御(rotateの方法)

デフォルトの設定

  • デフォルト設定のままだと、「ルート/storage/logs」配下に
    lumen.logが吐かれる。
    全てのログがこの1ファイルにずっと吐き続けられる。

laravelの設定

  • 「ルート/config/app.php」のlog(キー値)に対して設定してあげると
    rotateの制御をしてくれるみたい。

lumenでの対応

やりたいこと

  • 日付単位でrotateさせたい
  • ログを今後管理するのを考えた時に、日付はファイル名に付加しないで日付のディレクトリを配置して、その下に吐かれるようにしたい

対応方法

  • 「ルート/app」直下にApplication.php(以下のファイル)を作成
<?php

namespace App;

use Monolog\Logger;
use Laravel\Lumen\Application as LumenApplication;
use Monolog\Handler\StreamHandler;
use Monolog\Formatter\LineFormatter;
use Monolog\Handler\NewRelicHandler;
use Monolog\Handler\RotatingFileHandler;

class Application extends LumenApplication
{

    /**
     * Register container bindings for the application.
     *
     * @return void
     */
    protected function registerLogBindings()
    {
        $this->singleton('Psr\Log\LoggerInterface', function () {
            return new Logger('lumen', $this->getMonologHandler());
        });
    }

    /**
     * Extends the default logging implementation with additional handlers if configured in .env
     *
     * @return array of type \Monolog\Handler\AbstractHandler
     */
    protected function getMonologHandler()
    {

        $errorLogger = new RotatingFileHandler(storage_path("logs/{date}/error.log"), 0, Logger::ERROR, false);
        $infoLogger = new RotatingFileHandler(storage_path("logs/{date}/info.log"), 0, Logger::INFO, false);

        $handlers = [];
        $handlers[] = $this->setLoggerFileFormat($errorLogger);
        $handlers[] = $this->setLoggerFileFormat($infoLogger);

        return $handlers;

    }

    /**
     * Loggerのファイル名と日付フォーマットを設定
     *
     * @param $logger
     * @return mixed
     */
    private function setLoggerFileFormat($logger) {

        $logger->setFilenameFormat('{filename}', 'Ymd');
        $logger->setFormatter(new LineFormatter(null, null, true, true));
        return $logger;

    }

}

  • 「ルート/bootstrap/app.php」の中で$appのインスタンス生成しているところを
    作成したApplication.phpを生成するように変更
$app = new App\Application(
    realpath(__DIR__.'/../')
);

参考URL

laracasts.com