Protokoll
- Einführung
- Konfigurieren
- Protokoll schreiben Nachricht
- erweitert Anpassung des Monolog-Protokollkanals
Einführung
Damit Sie besser verstehen, was in Ihrer Anwendung passiert, bietet Laravel einen leistungsstarken Protokollierungsdienst, mit dem Sie Protokollnachrichten und Systemfehlerprotokolle in Dateien aufzeichnen und sogar Slack-Benachrichtigungen für Ihre Anwendung verwenden können gesamtes Team.
Im Laravel-Framework verwendet Laravel die Monolog-Bibliothek, die Unterstützung für eine Vielzahl leistungsstarker Protokollverarbeitung bietet. Mit Laravel können Sie diese Handler einfach konfigurieren, sodass Sie sie für die benutzerdefinierte Verarbeitung von Anwendungsprotokollen kombinieren können.
Konfiguration
Die gesamte Konfiguration des Anwendungsprotokollierungssystems befindet sich in der Konfigurationsdatei config/logging.php
. Mit dieser Datei können Sie Ihre Anwendungsprotokollkanäle konfigurieren. Überprüfen Sie daher unbedingt jeden verfügbaren Kanal und seine Optionen. Natürlich gehen wir im Folgenden auf einige der häufig verwendeten Optionen ein.
Standardmäßig verwendet Laravel stack
zum Protokollieren von Nachrichten. Der Stack-Kanal wird verwendet, um mehrere Protokollkanäle in einem einzigen Kanal zusammenzufassen. Weitere Informationen zum Stack finden Sie in der Dokumentation unten.
Kanalnamen konfigurieren
Standardmäßig wird Monolog mit einem „Kanalnamen“ instanziiert, der der aktuellen Umgebung entspricht, z. B. production
oder local
. Um diesen Wert zu ändern, fügen Sie Ihrer Kanalkonfiguration eine name
-Option hinzu:
'stack' => [ 'driver' => 'stack', 'name' => 'channel-name', 'channels' => ['single', 'slack'], ],
Verfügbare Kanaltreiber
名称 | 描述 |
---|---|
stack | 一个便于创建『多通道』通道的包装器 |
single | 单个文件或者基于日志通道的路径 (StreamHandler ) |
daily | 一个每天轮换的基于 Monolog 驱动的 RotatingFileHandler |
slack | 一个基于 Monolog 驱动的 SlackWebhookHandler |
syslog | 一个基于 Monolog 驱动的 SyslogHandler |
errorlog | 一个基于 Monolog 驱动的 ErrorLogHandler |
monolog | 一个可以使用任何支持 Monolog 处理程序的 Monolog 工厂驱动程序 |
custom | 一个调用指定工厂创建通道的驱动程序 |
{Tipp} Informationen zu
monolog
- undcustom
-Treibern finden Sie unter Erweiterte Kanalanpassung
Konfigurieren einzelner und täglicher Kanäle
single
und daily
Der Kanal enthält drei optionale Konfigurationselemente: bubble
, permission
und locking
.
name | Beschreibung | Standardwert | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Geben Sie nach der Verarbeitung der Nachricht an, ob die Nachricht gepusht wird zu anderen Kanälen< /td> | true | ||||||||||||
<🎜> | Protokolldateiberechtigungen | 644 | ||||||||||||
<🎜> | Versuch, die Protokolldatei vor dem Schreiben zu sperren | false |
Konfigurieren eines Slack-Kanals
slack
Kanäle erfordern die Konfigurationsoption url
. Diese URL sollte mit einem eingehenden Webhook übereinstimmen, den Sie für Ihr Slack-Team konfiguriert haben.
Erstellen eines Protokollstapels
Wie bereits erwähnt, ermöglicht Ihnen der stack
-Treiber die Integration mehrerer Protokollkanäle in einem einzigen Protokollkanalkanal. Schauen wir uns ein Beispiel für eine Anwendungskonfiguration auf Produktionsebene an, um zu sehen, wie der Protokollstapel verwendet wird: :
'channels' => [ 'stack' => [ 'driver' => 'stack', 'channels' => ['syslog', 'slack'], ], 'syslog' => [ 'driver' => 'syslog', 'level' => 'debug', ], 'slack' => [ 'driver' => 'slack', 'url' => env('LOG_SLACK_WEBHOOK_URL'), 'username' => 'Laravel Log', 'emoji' => ':boom:', 'level' => 'critical', ], ],
Lassen Sie uns diese Konfiguration analysieren. Als erstes ist zu beachten, dass stack
mithilfe seiner Option channels
zwei weitere Kanäle aggregiert: syslog
und slack
. Daher haben beim Protokollieren einer Protokollnachricht beide Kanäle die Möglichkeit, die Aufzeichnung der Protokollnachricht abzuschließen:
Protokollebene
Bitte beachten Sie die syslog
und < in der obiges Beispiel slack
Konfigurationselemente, die in 🎜> vorhanden sind. Diese Option bestimmt die Mindestprotokollierungsstufe, die von diesem Kanal protokolliert werden muss. Monolog (ein leistungsstarker Laravel-Protokollierungsdienst) akzeptiert alle in der RFC 5424-Spezifikation definierten Stufen: level
Notfall, Alarm, kritisch, Fehler, Warnung, Hinweis, Info und Debug.
-Methode, um die Nachricht zu protokollieren: debug
Log::debug('An informational message.');Gemäß unserer Konfiguration protokolliert der
-Kanal die Nachricht jedoch im Systemprotokoll Wenn die Nachricht nicht syslog
oder höher ist, wird sie nicht an Slack gesendet. Wenn wir eine critical
-Nachricht protokollieren, wird diese an Syslog und Slack gesendet, da der Level von emergency
höher ist als die Mindestlevelgrenze für beide Kanäle: emergency
Log::emergency('The system is down!');Protokollnachrichten schreibenkann die
-Fassade verwenden Schreiben Sie Informationen in das Protokoll. Wie bereits erwähnt, stellt die Protokollierung die verfügbaren Protokollierungsstufen bereit, die in der RFC 5424-Spezifikation definiert sind: Log
Notfall, Alarm, kritisch, Fehler, Warnung, Hinweis, info und debug:
Log::emergency($message); Log::alert($message); Log::critical($message); Log::error($message); Log::warning($message); Log::notice($message); Log::info($message); Log::debug($message);Daher können Sie jede dieser Methoden aufrufen, um die entsprechende Ebene zu protokollieren. Standardmäßig werden Nachrichten in den Standardprotokollkanal geschrieben, der in der
-Konfigurationsdatei definiert ist: config/logging.php
<?php namespace App\Http\Controllers;use App\User; use Illuminate\Support\Facades\Log; use App\Http\Controllers\Controller; class UserController extends Controller{ /** * 显示给定用户的配置信息。 * * @param int $id * @return Response */ public function showProfile($id) { Log::info('Showing user profile for user: '.$id); return view('user.profile', ['user' => User::findOrFail($id)]); } }Kontextinformationen An ein Array von Kontextdaten kann übergeben werden Protokollmethode. Die Informationen werden formatiert und mit der Protokollmeldung angezeigt:
Log::info('User failed to login.', ['id' => $user->id]);
In angegebenen Kanal schreiben
Manchmal möchten Sie möglicherweise Nachrichten an einen anderen Kanal als den Standardkanal der Anwendung schreiben. Sie können die Log
-Methode der channel
-Fassade verwenden, um jeden in der Konfigurationsdatei definierten Kanal abzurufen und die Nachricht hineinzuschreiben:
Log::channel('slack')->info('Something happened!');
Wenn Sie einen On-Demand-Aufzeichnungsstapel erstellen möchten, der aus mehreren Kanälen besteht , können Sie stack
verwenden Methode:
Log::stack(['single', 'slack'])->info('Something happened!');
Hochgradig angepasster Monolog-Kanal
Anpassen für Kanäle Monolog
Manchmal müssen Sie den Monolog eines vorhandenen Kanals vollständig steuern: Beispielsweise möchten Sie möglicherweise einen benutzerdefinierten Monolog FormatterInterface
für die Protokollverarbeitung für einen bestimmten Kanal konfigurieren:
Konfigurieren Sie zuerst den Kanal. Definieren Sie ein tap
-Array in . Das Array tap
enthält eine Liste von Klassen, die nach der Erstellung des Kanals in benutzerdefinierten Monolog-Instanzen verwendet werden können:
'single' => [ 'driver' => 'single', 'tap' => [App\Logging\CustomizeFormatter::class], 'path' => storage_path('logs/laravel.log'), 'level' => 'debug', ],
Sobald die Option tap
im Kanal konfiguriert ist, ist dies erforderlich Bereiten Sie es für die Verwendung in der benutzerdefinierten Monolog-Instanzklasse vor. Diese Klasse erfordert eine Methode: __invoke
, die eine IlluminateLogLogger
-Instanz als Parameter akzeptiert. Die IlluminateLogLogger
-Instanz leitet alle Methodenaufrufe an die zugrunde liegende Monolog-Instanz weiter:
<?php namespace App\Logging; class CustomizeFormatter{ /** * 自定义给定的日志实例。 * * @param \Illuminate\Log\Logger $logger * @return void */ public function __invoke($logger) { foreach ($logger->getHandlers() as $handler) { $handler->setFormatter(...); } } }
{tip} Alle „Tap“-Klassen werden vom Service-Container aufgelöst, sodass alle von ihnen abhängigen Konstruktoren automatisch eingefügt werden .
Erstellen eines Monolog-Prozessorkanals
Monolog verfügt über eine Vielzahl verfügbarer Prozessoren. In manchen Fällen möchten Sie möglicherweise nur einen Monolog-gesteuerten Protokolltyp mit einem bestimmten Prozessor erstellen. Diese Kanäle können mit dem monolog
-Treiber erstellt werden.
Bei Verwendung des monolog
-Treibers wird das Konfigurationselement handler
verwendet, um den zu instanziierenden Prozessor anzugeben. Wenn der Konstruktor des Prozessors Parameter erfordert, können Sie das optionale Konfigurationselement with
verwenden, um Folgendes anzugeben:
'logentries' => [ 'driver' => 'monolog', 'handler' => Monolog\Handler\SyslogUdpHandler::class, 'with' => [ 'host' => 'my.logentries.internal.datahubhost.company.com', 'port' => '10000', ], ],
Monolog-Formatierung
Verwenden Sie den monolog
-Treiber, Monologs LineFormatter
wird als Standardformatierer verwendet. Natürlich können Sie auch die Konfigurationselemente formatter
und formatter_with
verwenden, um den Formatprozessortyp anzupassen:
'browser' => [ 'driver' => 'monolog', 'handler' => Monolog\Handler\BrowserConsoleHandler::class, 'formatter' => Monolog\Formatter\HtmlFormatter::class, 'formatter_with' => [ 'dateFormat' => 'Y-m-d', ], ],
Wenn der verwendete Monolog-Prozessor einen eigenen Formatgenerierungsprozessor bereitstellen kann, können Sie formatter
verwenden Das Konfigurationselement ist angegeben als default
:
'newrelic' => [ 'driver' => 'monolog', 'handler' => Monolog\Handler\NewRelicHandler::class, 'formatter' => 'default', ],
Kanäle über die Fabrik erstellen
Wenn Sie einen vollständig benutzerdefinierten Kanal definieren möchten, haben Sie die volle Kontrolle über die Instanziierung und Konfiguration von Monolog. Sie können den config/logging.php
-Treiber im custom
-Konfigurationsdateityp angeben. Ihre Konfiguration sollte eine via
-Option enthalten, die auf die Factory-Klasse verweist, die zum Erstellen von Monolog-Instanzen aufgerufen wird:
'channels' => [ 'custom' => [ 'driver' => 'custom', 'via' => App\Logging\CreateCustomLogger::class, ], ],
Sobald der custom
-Kanal konfiguriert ist, können Sie die Klasse definieren, die Monolog-Instanzen erstellt. Diese Klasse benötigt nur eine Methode: __invoke
, die eine Monolog-Instanz zurückgeben kann:
<?php namespace App\Logging;use Monolog\Logger; class CreateCustomLogger{ /** * 创建一个 Monolog 实例. * * @param array $config * @return \Monolog\Logger */ public function __invoke(array $config) { return new Logger(...); } }