Lumen 实现自定义LOG目录

作者: codefine | 来源:发表于2016-10-22 17:14 被阅读4185次

    问题背景:

    Lumen 的runtime Log 默认保存在项目目录 storage/logs/lumen.log

    由于对写日志这种有要求,必须放到项目之外怎么办?

    想这么做也很简单,写几行代码 就可以了。

    查看源码,找到Log是如何注册的。

    vendor/laravel/lumen-framework/src/Application.php 中的代码如下:

    <?php
    
    namespace Laravel\Lumen;
    
    class Application extends Container
    {
    
        // ... 
        /**
         * Register container bindings for the application.
         *
         * @return void
         */
        protected function registerLogBindings()
        {
            $this->singleton('Psr\Log\LoggerInterface', function () {
                if ($this->monologConfigurator) {
                    return call_user_func($this->monologConfigurator, new Logger('lumen'));
                } else {
                    return new Logger('lumen', [$this->getMonologHandler()]);
                }
            });
        }
    
        
        /**
         * Get the Monolog handler for the application.
         *
         * @return \Monolog\Handler\AbstractHandler
         */
        protected function getMonologHandler()
        {
            return (new StreamHandler(storage_path('logs/lumen.log'), Logger::DEBUG))
                                ->setFormatter(new LineFormatter(null, null, true, true));
        }
        
        // ...
    }
    

    好了, 看来只要修改getMonologHandler()就可以了。

    本着面向对象的思路,面向接口和配置编程,决定不改源码,用继承的方式来扩展我们的功能。

    添加代码 app/Applicaiton.php

    <?php
    
    /**
     *
     * 自定义Application 实现自定义LOG目录
     * lumen log配置在 .env  env('APP_LOG_PATH')
     */
    namespace App;
    
    use Laravel\Lumen\Application as LumenApplication;
    use Monolog\Formatter\LineFormatter;
    use Monolog\Handler\StreamHandler;
    use Monolog\Logger;
    
    class Application extends LumenApplication
    {
    
        /**
         * Create a new Lumen application instance.
         *
         * @param  string|null  $basePath
         * @return void
         */
        public function __construct($basePath = null)
        {
            parent::__construct($basePath);
        }
    
        /**
         * Get the Monolog handler for the application.
         *
         * @return \Monolog\Handler\AbstractHandler
         */
        protected function getMonologHandler()
        {
            return (new StreamHandler(
                env('APP_LOG_PATH') ? env('APP_LOG_PATH') : storage_path('logs/lumen.log'), 
                Logger::DEBUG))->setFormatter(new LineFormatter(null, null, true, true));
        }
    }
    
    

    修改Lumen要启动的Application实例 bootstrap/app.php

    //原来的代码
    $app = new Laravel\Lumen\Application(
        realpath(__DIR__.'/../')
    );
    
    // 改为 
    
    $app = new App\Application(
        realpath(__DIR__.'/../')
    );
    
    

    不要忘记 .env 中添加配置

    .env示例

    APP_LOG_PATH=/data/logs/apps/lumen/lumen.log
    

    相关文章

      网友评论

        本文标题:Lumen 实现自定义LOG目录

        本文链接:https://www.haomeiwen.com/subject/exjhuttx.html