Wie füge ich Daten zu allen Protokolldatensätzen in Laravel hinzu?
Frage
Ich möchte allen Protokolldatensätzen in meiner Laravel-Anwendung einige Daten hinzufügen.
Ich denke, es wäre hilfreich, den Benutzernamen des aktuellen Benutzers und/oder die Client-IP-Adresse zu kennen.
Derzeit füge ich es manuell hinzu, indem ich Folgendes tue:
Log::info('Pre-paid activation.', array('username' => Auth::user()->username));
Aber ich würde gerne wissen, wie man einen Listener hinzufügt oder etwas macht alle Log-Datensätze haben den Benutzernamen (falls verfügbar).
Lösung
Da Laravel sofort einsatzbereit ist Monolog, es ist ziemlich einfach.Dies kann leicht durch Bearbeiten erreicht werden app/start/global.php
und fügen Sie nach der Zeile, die mit beginnt, Folgendes hinzu: 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;
});
Grundsätzlich verwenden wir die zugrunde liegende Monolog-Instanz, um einen Prozessor zu registrieren, der alle zu schreibenden Protokolldatensätze abfängt.Die Ergebnisse werden wie folgt aussehen:
[12.04.2014 23:07:35] local.INFO:Prepaid-Aktivierung.[] {"user": "anonymous", "ip":::1"}
Weitere Informationen zu Monolog-Prozessoren: https://github.com/Seldaek/monolog/blob/master/doc/01-usage.md#using-processors
Extra: Das hartcodierte extra
besteht darin, Monolog anzuweisen, Daten als zusätzliche Informationen hinzuzufügen (was überflüssig wäre).In der Praxis soll dadurch vermieden werden, dass im ursprünglichen Protokollaufruf hinzugefügte Kontextdaten überschrieben werden.
Andere Tipps
In Laravel 5 können Sie dies tun, indem Sie Monolog anpassen.Erstellen Sie zunächst eine Klasse, die Monolog so anpasst, dass die Benutzerinformationen zu den Protokolldatensätzen hinzugefügt werden:
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;
}
}
Verbinden Sie dann die Klasse mit dem Laravel-Logger, indem Sie sie zum Kanal-Setup im hinzufügen config/logging.php
Datei:
// ...
'channels' => [
'single' => [
'driver' => 'single',
'tap' => [\App\Logging\AddUserInformation::class],
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
],
// ...
]