Laravel 7 fijado ruta de registro de forma dinámica en la clase de empleo

966p:

Im la construcción de proyectos en laravel 7,3 con múltiples trabajos que se ejecutan al mismo tiempo. Necesito hacer cada registros de escritura de empleo a diferentes archivo girado diaria. El nombre del archivo de registro se debe basar en el modelo, que Job está procesando.

El problema es que no puedo encontrar una solución inteligente.

Lo que he intentado:

1) la creación de múltiples canales en config/logging.php.

Que funciona como se esperaba, pero en la actualidad hay alrededor de 50 diferentes puestos de trabajo y la cantidad sigue creciendo. Método es feo y apenas mantenido.

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

Messing con la variable de configuración era mala idea debido a muchos puestos de trabajo que se ejecutan una sola vez. Como mensajes de resultados de un trabajo a menudo se escribieron en otro registro de empleo.

3) usando Log::useDailyFiles()

Parece que este deja de funcionar desde laravel 5.5 o 5.6. El simple hecho de error Call to undefined method Monolog\Logger::useDailyFiles(). ¿Alguna idea de cómo hacen con el trabajo en laravel 7?

4) utilizando tapel parámetro para el canal en config/logging.php.

Ejemplo de documentos laravel ideas de cómo pasar el nombre del modelo en CustomizeFormatter al nombre del archivo de configuración.

Im casi seguro que hay solución inteligente y im sólo falta algo. Cualquier sugiere? ¡Gracias!

Shizzen83:

Se podría heredar el gestor de registro para permitir una configuración dinámica

<?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;
    }
}

De la misma manera sobre el proveedor de servicios de registro de laravel excepto éste puede ser totalmente reemplazado

<?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: Acabo de ver que el proveedor de servicios de registro de laravel no se encuentra en config/app.php, esto es porque es "duro-cargado" por la aplicación. Todavía se puede sustituirla por la herencia de la propia aplicación

<?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));
    }
}

Y, finalmente, en bootstrap/app.php, reemplace Illuminate\Foundation\ApplicationconApp\Foundation\Application

Por ejemplo, si usted intenta esto

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

Laravel usará la singleconfiguración y de escritura de canal a users.logsi su resolución es la lógica

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

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=406807&siteId=1
Recomendado
Clasificación