كيفية إضافة البيانات إلى كافة سجلات السجل في لارافيل?

StackOverflow https://stackoverflow.com//questions/23037393

  •  21-12-2019
  •  | 
  •  

سؤال

وأود أن أضيف بعض البيانات إلى جميع سجلات السجل داخل تطبيق لارافيل بلدي.

أعتقد أنه سيكون من المفيد معرفة اسم المستخدم للمستخدم الحالي و / أو عنوان إب العميل.

حاليا أنا إضافته يدويا عن طريق القيام:

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

ولكن أود أن أعرف كيفية القيام بإضافة مستمع أو شيء لجعل الكل سجل مسجل لديك اسم المستخدم (إن وجد).

هل كانت مفيدة؟

المحلول

منذ لارافيل يخرج من مربع مع مونولوج, ، إنه مستقيم إلى الأمام.يمكن تحقيقه بسهولة عن طريق التحرير app/start/global.php وإضافة ما يلي بعد السطر الذي يبدأ مع: 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;
});

في الأساس ، نحن نستخدم مثيل مونولوج الأساسي لتسجيل المعالج الذي سوف اعتراض أي سجل سجل لتكون مكتوبة.ستكون النتائج مماثلة كما يلي:

[2014-04-12 23: 07: 35] local.INFO:تفعيل المدفوعة مسبقا.[] {"المستخدم":"مجهول" ، "إب":":: 1"}

مزيد من المعلومات حول معالجات مونولوج: https://github.com/Seldaek/monolog/blob/master/doc/01-usage.md#using-processors


إضافي: هاردكوديد extra هو أن أقول مونولوج لإضافة البيانات كقطعة إضافية من المعلومات (زائدة عن الحاجة ليقول).في الممارسة العملية ، هذا لتجنب تجاوز أي بيانات سياق مضافة في استدعاء السجل الأصلي.

نصائح أخرى

في لارافيل 5 يمكنك أن تفعل ذلك عن طريق تخصيص مونولوج.قم أولا بإنشاء فئة تقوم بتخصيص مونولوج بحيث تضيف معلومات المستخدم إلى سجلات السجل:

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;
    }
}

ثم قم بتوصيل الطبقة إلى مسجل لارافيل عن طريق إضافته إلى إعداد القناة في config/logging.php ملف:

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

وثائق حول تخصيص مونولوج

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top