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目录

    问题背景: Lumen 的runtime Log 默认保存在项目目录 storage/logs/lumen.log...

  • lumen 目录整合

    lumen 目录清单 在lumen 基础上添加了 Helpers Models Libs 三个目录 ...

  • log4j

    log4j.rootLogger=表示根目录log4j.category.*是对自定义类的设置,可以对类、包和工程...

  • 实现一个自定义类加载器

    实现一个自定义类加载器,加载自定义目录下的类。 要读取的自定义目录的类 自定义ClassLoader 开始读取类 ...

  • Retrofit使用Log拦截器在控制台输出Log

    一、使用自定义Log拦截器 1、创建自定义Log拦截器类 2、使用Log拦截器 二、使用okhttp官方Log拦截...

  • 2018-05-09 Windows下nginx配置与lumen

    配置nginx 在Nginx的目录下的conf目录下打开nginx.conf. 更改配置 将lumen根目录定义为...

  • Swift自定义log以及其它

    一、自定义Log 在Swift中,我们也需要如OC一样,对log进行自定义。下面是一个我自定义的log,示例如下:...

  • 【Unity】自定义Log

    有的功能 可以自定义Log的颜色 可以添加模块 可以自定义Log输出级别,上线后关闭Log 可以写入本地,方便查看...

  • 自定义控件:分割线(Divider)

    自定义属性 目录:res/attrs.xml 代码实现 使用示例

  • Lumen路由实现

    一、Lumen路由的使用 在了解实现之前,我们先了解其使用的方法以及其作用也是很重要的。Lumen路由对象是在构建...

网友评论

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

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