Domanda

Vorrei aggiungere alcuni dati a tutti i record di registro all'interno della mia applicazione Laravel.

Penso che sarebbe utile conoscere il nome utente dell'attuale utente e / o l'indirizzo IP client.

Attualmente lo sto aggiungendo manualmente facendo:

Log::info('Pre-paid activation.', array('username' => Auth::user()->username));
.

Ma vorrei sapere come fare un ascoltatore o qualcosa da fare tutto registri registri ha il nome utente (se disponibile).

È stato utile?

Soluzione

Dal momento che la Laravel arriva fuori dalla scatola con monolog , è piuttosto semplice. Può essere facilmente raggiunto modificando app/start/global.php e aggiunge quanto segue dopo la linea con cui inizia: Log::useFiles:

Log::useFiles(storage_path().'/logs/laravel.log');
$monolog = Log::getMonolog();
$monolog->pushProcessor(function ($record) {
    $record['extra']['user'] = Auth::user() ? Auth::user()->username : 'anonymous';
    $record['extra']['ip'] = Request::getClientIp();
    return $record;
});
.

Fondamentalmente, stiamo utilizzando l'istanza monologica sottostante per registrare un processore che intercetterà qualsiasi record di registro da scrivere. I risultati saranno simili come i seguenti:

.

[2014-04-12 23:07:35] local.info: attivazione pre-pagata. [] {"Utente": "Anonymous", "IP": ":: 1"}

Ulteriori informazioni sui processori di Monolog: https://github.com/seldaek/monolog/blob/master/doc/01-usage.md#ing-processor


.

Extra: Il extra Hardcoded è quello di dire a Monolog di aggiungere dati come ulteriore informazione (ridondante da dire). Nella pratica, questo è quello di evitare il sovrascrivero qualsiasi dato di contesto aggiunto nella chiamata di registro originale.

Altri suggerimenti

A Laravel 5 puoi farlo personalizzando monolog.Prima crea una classe che personalizza Monolog quindi aggiunge le informazioni dell'utente ai record di registro:

namespace App\Logging;

use App\Models\User;
use Illuminate\Foundation\Application;
use Illuminate\Http\Request;
use Illuminate\Log\Logger;

class AddUserInformation
{
    protected $request;

    public function __construct(Request $request = null)
    {
        $this->request = $request;
    }

    public function __invoke(Logger $logger)
    {
        if ($this->request) {
            foreach ($logger->getHandlers() as $handler) {
                $handler->pushProcessor([$this, 'processLogRecord']);
            }
        }
    }

    public function processLogRecord(array $record): array
    {
        $record['extra'] += [
            'user' => $this->request->user()->username ?? 'guest',
            'ip' => $this->request->getClientIp()
        ];

        return $record;
    }
}
.

Quindi collegare la classe al LarGer Larvel aggiungendolo all'impostazione del canale nel file config/logging.php:

// ...
'channels' => [
    'single' => [
        'driver' => 'single',
        'tap' => [\App\Logging\AddUserInformation::class],
        'path' => storage_path('logs/laravel.log'),
        'level' => env('LOG_LEVEL', 'debug'),
    ],
    // ...
]
.

Una documentazione sulla personalizzazione di monolog

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top