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 tap
el 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!
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\Application
conApp\Foundation\Application
Por ejemplo, si usted intenta esto
app('log')->channel('single:users')->debug('test');
Laravel usará la single
configuración y de escritura de canal a users.log
si su resolución es la lógica
$baseConfig['path'] = $model + '.log';