laravel 改进了在运行时设置默认日志通道的方法

jaql4c8m  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(110)

我的Laravel应用程序支持多个domains。我希望每个域都记录到不同的文件,因为它们都很忙碌,记录了很多消息。
现在,我正在使用这行代码

config(['logging.default' => 'app-1']);

在每个entry point [1]中,对于一个名为app-1的给定域,以及每个独特应用程序的类似代码行。
当然,我必须在config/logging.php中有一个部分来定义每个这样的特定于域的通道。域的数量足够小,并且很少更改,所以这不是问题。
但我觉得这有点古怪。有没有更好的方法呢?
[1]:我必须在任何执行的顶级方法中使用这样一行代码,因此一个域中的每个Controller、每个Command和每个Job(至少)都必须使用这一行代码来为所有对Log::xxx()的后续调用设置default日志记录通道。

1szpjjfi

1szpjjfi1#

如果你需要为每个请求做一些事情,中间件通常是答案。所以通过运行artisan make:middleware DomainLogger创建一个中间件。编辑它看起来像这样:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class DomainLogger
{
    /**
     * Handle an incoming request.
     *
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {
        $domain = $request->getHost();
        // use whatever logic to match these up; static map, db lookup, etc.
        $logger = match($domain) {
            'example.com' => 'foo',
            'example.net' => 'bar',
            'example.org' => 'baz',
            default => 'def',
        };
        config('logging.default', $logger);

        return $next($request);
    }
}

然后在app\Http\Kernel.php中注册

protected $middleware = [                                                                       
    ...
    App\Http\Middleware\DomainLogger::class,                                                              
];

相关问题