現在認証されているユーザーIDをカスタムログフォーマットとしてログ行に追加します(syslogドライバーを使用しています)。
私の調査の一環として、ユーザーのアクティビティをデータベースに記録するための優れたパッケージとチュートリアルがあることを確認しました。しかし、少なくとも今のところ、私の意図は、現在行っているように、追加のパッケージやsyslogへのログ記録なしで前進することです。
私のアプリでの典型的なログ呼び出しは次のようになります。
logger()->info("Listing all items");
私は次のようなこともできます:
$uid = Auth::id();
logger()->info("Listing all items for {$uid}");
これは、ドキュメントの例が示唆しているものと似ています。
現在、特定の行でこれを行っていますが、すべてのログ呼び出しでこれを実行したいので、何かをログに記録するたびに自分自身を繰り返すようになります。
電流:
Dec 10 23:54:05 trinsic Laravel[13606]: local.INFO: Hello world []
望ましい:
Dec 10 23:54:05 trinsic Laravel[13606]: local.INFO [AUTH_USER_ID=2452]: Hello world []
ドキュメントで提案されているように、フォーマットの変更に成功してロガーをタップしようとしました。
しかし、私の現在の問題は、CustomizeFormatter
クラスが実行された時点で、Auth IDがまだ解決されていないように見えることです(これについてはわかりませんが、dd()
nullを返すので、それは私の推測です):
<?php
namespace App\Logging;
use Illuminate\Support\Facades\Auth;
use Monolog\Formatter\LineFormatter;
class CustomizeFormatter
{
/**
* Customize the given logger instance.
*
* @param \Illuminate\Log\Logger $logger
* @return void
*/
public function __invoke($logger)
{
$authUser = Auth::id(); // null
foreach ($logger->getHandlers() as $handler) {
$formatter = new LineFormatter("%channel%.%level_name% [AUTH={$authUser}]: %message% %extra%");
$handler->setFormatter($formatter);
}
}
}
Laravel 5.7ログドライバー: syslog
// config/logging.php
'syslog' => [
'driver' => 'syslog',
'tap' => [ App\Logging\CustomizeFormatter::class ],
'level' => 'debug',
],
DigitalDrifterの回答と、EmirKarşıyakalıからのこの投稿の一部に基づいて、私はなんとか十分に公正な解決策を得ることができました。
(現時点での私の理解によると)まだ解決できないため、ユーザーIDを取得できませんでした。しかし、多かれ少なかれ正確なクライアントIDとセッションIDを取得することに満足しているので、ログでユーザーインタラクションスレッドを追跡できます。
<?php
namespace App\Loggers;
use Monolog\Formatter\LineFormatter;
class LocalLogger
{
private $request;
public function __construct(\Illuminate\Http\Request $request)
{
$this->request = $request;
}
public function __invoke($logger)
{
foreach ($logger->getHandlers() as $handler) {
$handler->setFormatter($this->getLogFormatter());
}
}
protected function getLogFormatter()
{
$uniqueClientId = $this->getUniqueClientId();
$format = str_replace(
'[%datetime%] ',
sprintf('[%%datetime%%] %s ', $uniqueClientId),
LineFormatter::SIMPLE_FORMAT
);
return new LineFormatter($format, null, true, true);
}
protected function getUniqueClientId()
{
$clientId = md5($this->request->server('HTTP_USER_AGENT').'/'.$this->request->ip());
$sessionId = \Session::getId();
return "[{$clientId}:{$sessionId}]";
}
}
構成:
// config/logger.php
'syslog' => [
'driver' => 'syslog',
'level' => 'debug',
'tap' => [App\Loggers\LocalLogger::class],
],
今、私は次のようなものを得ることができます:
Dec 11 13:54:13 trinsic Fimedi[13390]: [2018-12-11 16:54:13] c6c6cb03fafd4b31493478e76b490650 local.INFO: Hello world
または
Dec 11 13:55:44 trinsic Fimedi[13390]: [2018-12-11 16:55:44] [c6c6cb03fafd4b31493478e76b490650:xUs2WxIb3TvKcpCpFNPFyvBChE88Nk0YbwZI3KrY] local.INFO: Hello world
ユーザー/セッションIDの計算方法によって異なります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加