ジョブクラスの動的Laravel 7セットのログ・パスを

966p:

同時に実行する複数のジョブでLaravel 7.3上でプロジェクトをビルドイム。私は別の、毎日回転したファイルに各ジョブの書き込みログを作成する必要があります。ログファイルの名前は、仕事を処理していることを、モデルに基づいている必要があります。

問題は、私はスマートな解決策を見つけるカントです。

私は試してみました:

1)内の複数のチャネルを作成しますconfig/logging.php

予想としてではなく、現時点での作品は50種類のジョブに関するがあると量が成長し続けていること。この方法は醜いと保てないです。

2)設定しますConfig(['logging.channels.CUSTOMCHANNEL.path' => storage_path('logs/platform/'.$this->platform->name.'.log')]);

コンフィグ変数をいじりしているため、一度に実行している多数のジョブの悪い考えでした。その結果、一つの仕事からのメッセージは、多くの場合、別のジョブ・ログに書かれていました。

3)使用 Log::useDailyFiles()

laravel 5.5または5.6以降の作業この停止のように思えます。ただ、エラーを取得Call to undefined method Monolog\Logger::useDailyFiles()laravel 7に仕事を作るためにどのように任意の考え?

4)使用tap中のチャンネルのパラメータをconfig/logging.php

laravelドキュメント内の例セットアップファイル名にCustomizeFormatterにモデル名を渡す方法はありませんアイデアが。

イムは、ほぼ必ずスマートなソリューションとイムだけ不足しているものがあります。どれ示唆?ありがとう!

Shizzen83:

あなたは、動的な構成を可能にするために、ログマネージャを継承することができ

<?php

namespace App\Log;

use Illuminate\Support\Str;
use Illuminate\Log\LogManager as BaseLogManager;

class LogManager extends BaseLogManager
{
    /**
     * Get the log connection configuration.
     *
     * @param  string  $name
     * @return array
     */
    protected function configurationFor($name)
    {
        if (!Str::contains($name, ':')) {
            return parent::configurationFor($name);
        }
        [$baseName, $model] = explode(':', $name, 2);
        $baseConfig = parent::configurationFor($baseName);
        $baseConfig['path'] = ...; //your logic
        return $baseConfig;
    }
}

同様に、この1を除いLaravelのログサービスプロバイダについて完全に置き換えることができます

<?php

namespace App\Log;

use Illuminate\Support\ServiceProvider;

class LogServiceProvider extends ServiceProvider
{
    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton('log', function ($app) {
            return new LogManager($app);
        });
    }
}

EDIT:Laravelのログサービスプロバイダから欠落していることを私は見てきたconfig/app.php、これはあるので、それの「ハード・ロード」のアプリケーションによって。あなたはまだアプリケーション自体を継承して、それを置き換えることができます

<?php

namespace App\Foundation;

use App\Log\LogServiceProvider;
use Illuminate\Events\EventServiceProvider;
use Illuminate\Routing\RoutingServiceProvider;
use Illuminate\Foundation\Application as BaseApplication;

class Application extends BaseApplication
{
    /**
     * Register all of the base service providers.
     *
     * @return void
     */
    protected function registerBaseServiceProviders()
    {
        $this->register(new EventServiceProvider($this));
        $this->register(new LogServiceProvider($this));
        $this->register(new RoutingServiceProvider($this));
    }
}

そして最後でbootstrap/app.php、交換するIlluminate\Foundation\ApplicationApp\Foundation\Application

たとえば、あなたはこれをしようとした場合

app('log')->channel('single:users')->debug('test');

Laravelは、使用するsingleには、チャンネルの設定や、書き込みをusers.logお使いの解像度のロジックがある場合

$baseConfig['path'] = $model + '.log';

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=406804&siteId=1