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).

War es hilfreich?

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'),
    ],
    // ...
]

Eine Dokumentation zum Anpassen von Monolog

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top