Laravel’de Spatie ActivityLog kullanımı (IP Adresi kaydı ile)

Laravel loglama açısından gerek kendi sunduğu imkanlar gerek 3. parti eklentiler ile loglama açısından geniş bir yelpazeye sahip. Spatie/ActivityLog paketi bu eklentilerden sadece birisi.

Ne zaman ve neden Spatie/ActivityLog’u tercih etmeliyim? derseniz cevap basit, Graylog gibi büyük ve kapsamlı bir log sistemine ihtiyacınız yoksa, amacınız sadece belirli işlemleri kullanıcıların IP adresleri ile birlikte en az eforla loglamak ise, Spatie/ActivityLog sizin için biçilmiş kaftan.

Spatie/Activity Log Kurulumu

Konsolu kullanarak proje klasörümüzün içerisinde aşağıdaki kodu çalıştırıyoruz (Geniş ve detaylı bilgi için:
https://github.com/spatie/laravel-activitylog/ ).

composer require spatie/laravel-activitylog

Paket sistemimize eklendi. Şimdi paketin kullandığı migrationu paketten dışarı çıkarıyoruz:

php artisan vendor:publish --provider="Spatie\Activitylog\ActivitylogServiceProvider" --tag="migrations"

Yukarıdaki kodu çalıştırdığınızda projenizin database/migrations klasörüne adı 2020_03_20_115742_create_activity_log_table.php gibi bir dosya eklenmiş olacak.

Sonra konfigürasyon dosyamızı da paketten çıkarıyoruz:

php artisan vendor:publish --provider="Spatie\Activitylog\ActivitylogServiceProvider" --tag="config"

Bu işlemi yaptığınızda ise projenizin config klasörüne activitylog.php isimli bir dosya eklenmiş olacak.

Artık migration için hazırız. Fakat önce uygulamamızın konfigürasyon ön belleğini güncellemeliyiz:

php artisan config:cache

Yukarıdaki işlemi atlarsanız muhtemelen “SQLSTATE[42601]: Syntax error: 7 ERROR: zero-length delimited identifier at or near “””” LINE 1: create table “” (“id” bigserial …” gibi başlayan bir hata alacaksınız. Nedeni tablo isminin ön belleğe alınmış konfigürasyon bilgileri arasında henüz yer almıyor olması.

Son olarak yapmamız gereken migration işlemini yapmak:

php artisan migrate

Bu aşamadan sonra log sistemi kurulmuş olacak. Herhangi bir modelde create, update, delete gibi metodlar çalıştığında loglama işleminin yapılmasını istiyorsanız modele aşağıdaki kodları eklemeniz yeterli:

<?php

namespace App;
use Illuminate\Database\Eloquent\Model;
use Spatie\Activitylog\Traits\LogsActivity;

class MyModel extends Model
{
    use LogsActivity;
    protected static $logAttributes = []; 

...
}

Eğer sadece bir modelden veri silindiğinde kayıt tutulmasını istiyorsanız modelinizde bunu aşağıdaki gibi belirtebilirsiniz:

<?php

namespace App;
use Illuminate\Database\Eloquent\Model;
use Spatie\Activitylog\Traits\LogsActivity;

class MyModel extends Model
{
    use LogsActivity;
    protected static $logAttributes = []; 

    //sadece delete metodu çalıştığında loglama çalışacak
    protected static $recordEvents = ['deleted'];
...
}

Daha farklı opsiyonlar için dökümantasyonu inceleyebilir ve detaylı bir konfigürasyon için config/activitylog.php dosyasını düzenleyebilirsiniz.

IP Adreslerini otomatik olarak log kayıtlarına ekleme

Her log kaydında kullanıcının ip adresini de kaydetmek istiyorsanız aşağıdaki kodu app/Http/Providers/ klasöründeki AppServiceProvider.php dosyasındaki boot metodunun içerisine yerleştiriniz:

<?php

...
use Spatie\Activitylog\Models\Activity;
...

class AppServiceProvider extends ServiceProvider
{
    ...
    public function boot(Request $request)
    {
        ...
        Activity::saving(function (Activity $activity) {
            $activity->properties = $activity->properties->put('ip', request()->ip());
        });
        ...
    }
}

Artık her log kaydında sistemin IP adreslerini de kaydettiğini görebilirsiniz.