Logging
استفاده از Facade Logging
Logging مسئول ثبت و واکشی لاگ تغییرات مدلها در دُراول است. برای نمایش UI از Log Generator و کلاسهای BaseLog استفاده میشود؛ این سند نحوه کار مستقیم با Facade را توضیح میدهد.
پیکربندی UI و فیلدهای قابلنمایش در Log Generator آمده است. این صفحه برای استفاده برنامهنویسی از Facade و ترکیب آن با BaseLog است.
امکانات
| متد | شرح |
|---|---|
| store | ذخیره یک رکورد لاگ با LogPayload. معمولاً از طریق رویداد ModelChanged فراخوانی میشود. |
| config | انتخاب کلاس BaseLog (یا نمونه آن) و شروع زنجیره واکشی. |
| filter | اعمال یک فیلتر تکی روی نتیجه (مثلاً type، ip، فیلد شناسه کاربر). |
| filters | اعمال چند فیلتر بهصورت آرایه. |
| fromRequest | خواندن فیلترها از query string درخواست HTTP (اختیاری؛ در صورت عدم ارسال، از request() فعلی استفاده میشود). |
| page | تعیین شماره صفحه برای pagination. |
| get | دریافت نتیجه نهایی (paginator یا آرایه بسته به driver). |
ثبت لاگ (store)
ثبت خودکار با فعال بودن dornica-app.logging.enable و رویداد ModelChanged انجام میشود. برای ثبت دستی:
use Dornica\Foundation\Logging\Facade\Logging;
use Dornica\Foundation\Logging\LogType;
use Dornica\Foundation\Logging\Support\LogPayload;
Logging::store(new LogPayload(
entity: $user,
action: LogType::UPDATE,
oldValues: ['email' => 'old@example.com'],
newValues: ['email' => 'new@example.com'],
context: [
'user' => auth()->user(),
'ip' => request()->ip(),
'page_route' => request()->route()?->getName(),
],
batchId: app(\Dornica\Foundation\Logging\LogBatchManager::class)->current(),
));
واکشی لاگ بدون Request
برای API، Job، Command یا هر جایی که Request HTTP در دسترس نیست، فیلترها را مستقیم پاس دهید:
use Dornica\Foundation\Logging\Facade\Logging;
use App\Generators\Logs\UserLog;
$logs = Logging::config(UserLog::class)
->filter('ip', '192.168')
->filter('type', [1, 2])
->page(1)
->get();
یا بهصورت دستهای:
$logs = Logging::config(UserLog::class)
->filters([
'code' => '0012345678',
'created_from' => '1403/01/01 00:00',
'created_to' => '1403/01/31 23:59',
])
->get();
بدون هیچ فیلتری (فقط محدودیتهای setResource() در کلاس Log):
$logs = Logging::config(UserLog::class)->get();
واکشی لاگ از Request
در کنترلر یا جایی که query string فیلتر UI را دارد:
use Dornica\Foundation\Logging\Facade\Logging;
use App\Generators\Logs\UserLog;
$logs = Logging::config(UserLog::class)
->fromRequest($request)
->get();
// یا با request فعلی:
$logs = Logging::config(UserLog::class)->fromRequest()->get();
کار همزمان با BaseLog و Facade Logging
BaseLog برای پیکربندی (منابع، فیلدها، برچسبها، pagination UI) است. Facade Logging برای اجرای کوئری روی driver (database / elastic).
از طریق BaseLog
متد getLogs() در BaseLog در واقع همان Facade را صدا میزند؛ پارامتر اختیاری است:
$log = new UserLog();
// بدون فیلتر
$logs = $log->getLogs();
// از Request
$logs = $log->getLogs($request);
// از آرایه فیلتر
$logs = $log->getLogs(['ip' => '127.0.0.1']);
از طریق Facade (پیشنهادی برای منطق سفارشی)
$query = Logging::config(UserLog::class);
if ($request->filled('ip')) {
$query->filter('ip', $request->input('ip'));
}
$logs = $query->get();
نمایش UI (Log Generator)
در Blade Layout، BaseLog برای رندر فرم فیلتر و فرمت خروجی استفاده میشود؛ Livewire component داخلی از Logging::config() برای واکشی استفاده میکند:
use Dornica\PanelKit\BladeLayout\Facade\BladeLayout;
use App\Generators\Logs\UserLog;
BladeLayout::log(UserLog::class);
return view('users.log');
{!! bladeLayout()->log()->render() !!}
برای صفحه پنل از BaseLog + Blade Layout کافی است. برای API، export، یا گزارشگیری برنامهای از Logging::config() استفاده کنید.
پارامترهای فیلتر
| فیلتر | پارامتر | توضیح |
|---|---|---|
| شناسه کاربر | مقدار setUserIdentifierField() (پیشفرض: code) | جستجو در userable |
| نوع عملیات | type | آرایه یا مقدار تکی: 1 ایجاد، 2 ویرایش، 3 حذف |
| بخش مربوطه | section | فقط وقتی بیش از یک Resource در Log تعریف شده باشد |
| آیپی | ip | جستجوی جزئی |
| بازه تاریخ | created_from / created_to | تاریخ شمسی |
| صفحه | page | شماره صفحه (یا متد page()) |
Driver
Driver از config('dornica-app.logging.driver') خوانده میشود. مقدار پیشفرض database است.
- database: خروجی
LengthAwarePaginatorبا Eloquent - elastic: خروجی آرایهای با کلیدهای
dataوpagination(در حال حاضر غیرفعال در تنظیمات پیشفرض)