كيفية إضافة البيانات إلى كافة سجلات السجل في لارافيل?
سؤال
وأود أن أضيف بعض البيانات إلى جميع سجلات السجل داخل تطبيق لارافيل بلدي.
أعتقد أنه سيكون من المفيد معرفة اسم المستخدم للمستخدم الحالي و / أو عنوان إب العميل.
حاليا أنا إضافته يدويا عن طريق القيام:
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'),
],
// ...
]