> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apinizer.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Trace Log Koleksiyonlarının Temizlenmesi

> Trace açık olduğunda API trafiğinin detaylarını kaydeden log_apiproxytraffic, log_apiproxytraffic_policy_execution ve log_apiproxytraffic_routing koleksiyonlarında depolanan kayıtlardan belirtilen zaman dilimine göre eski kayıtların temizlenmesini sağlar.

<Warning>
  Zaman filtresi UTC'e göre yapılmaktadır.
</Warning>

Trace'in açık olduğu durumda; `log_apiproxytraffic`, `log_apiproxytraffic_policy_execution`, `log_apiproxytraffic_routing` isimli koleksiyonlar API trafiğinin detaylarını kaydeder. Trace kapatıldıktan sonra bile bu veriler veritabanında tutulmaya devam edilir. Bu kayıtlar sayesinde trace ekranında, ilgili proxy'deki politika(lar) uygulanmadan önce ve sonra ne durumda olduğu, trafik bilgileri ve yönlendirme bilgileri incelenebilir.

## Kayıt Temizleme Scripti

Aşağıdaki script, MongoDB'deki `log_apiproxytraffic`, `log_apiproxytraffic_policy_execution`, `log_apiproxytraffic_routing` koleksiyonlarında depolanan kayıtlardan belirtilen saat öncesine kadar olan kayıtları silmek için kullanılır. Bu işlem ile veritabanı temizlenerek depolama alanı optimize edilir.

```bash theme={null}
#!/bin/bash
 
# MongoDB sunucusuna bağlanmak için gerekli bilgiler
HOST="<MONGODB_MASTER_IP_ADDRESS>"
PORT="<MONGODB_PORT>"
DB_NAME="apinizerdb"
USERNAME="apinizer"
PASSWORD="<PASSWORD>"
AUTH_DB="admin"
TARGET_COLLECTIONS=("log_apiproxytraffic_policy_execution" "log_apiproxytraffic" "log_apiproxytraffic_routing")
TARGET_LOG_LOCATION=$(pwd)/purge_trace_logs.log
 
echo "Script started on $(date +"%Y-%m-%d %H:%M:%S")" >> $TARGET_LOG_LOCATION  
 
# Son kaç saat/gün öncesine kadar olan belgelerin silineceğini belirten değişken
TIME_VALUE="1D"  #Bu değeri istediğiniz gibi değiştirebilirsiniz.
 
QUERY_CONDITION=""
 
# TIME_VALUE değerini analiz edip milisaniye cinsinden dönüştürme
if [[ ! -z $TIME_VALUE ]]; then
    if [[ $TIME_VALUE =~ [Hh]$ ]]; then
        HOURS_AGO=${TIME_VALUE%H*}
        TIME_IN_MILLISECONDS=$(($HOURS_AGO * 60 * 60 * 1000))
        QUERY_CONDITION="\"timestamp\": {\"\$lt\": new Date((new Date().getTime() - $TIME_IN_MILLISECONDS))}"
    elif [[ $TIME_VALUE =~ [Dd]$ ]]; then
        DAYS_AGO=${TIME_VALUE%D*}
        TIME_IN_MILLISECONDS=$(($DAYS_AGO * 24 * 60 * 60 * 1000))
        QUERY_CONDITION="\"timestamp\": {\"\$lt\": new Date((new Date().getTime() - $TIME_IN_MILLISECONDS))}"
    else            
        echo "Invalid time format. Please enter a value ending with H (hour) or D (day)." >> $TARGET_LOG_LOCATION
         exit 1
    fi
fi
 
if [[ -z $QUERY_CONDITION ]]; then
    echo "TIME_VALUE is not valid." >> $TARGET_LOG_LOCATION
    exit 1
fi
 
for COLLECTION in "${TARGET_COLLECTIONS[@]}"; do
MONGO_COMMANDS=$(cat <<EOF
var bulk = db.getCollection("$COLLECTION").initializeUnorderedBulkOp();
bulk.find({$QUERY_CONDITION}).remove();
bulk.execute();
EOF
)
 
    # Komutu çalıştır ve çıktısını log dosyasına yazdır
    {
        mongosh mongodb://$USERNAME:$PASSWORD@$HOST:$PORT/$DB_NAME --authenticationDatabase $AUTH_DB --eval "$MONGO_COMMANDS"
        # Komutun tamamlanmasını kontrol et
        if [ $? -ne 0 ]; then
            echo "MongoDB command for collection $COLLECTION failed." >> $TARGET_LOG_LOCATION
            exit 1
        fi
    } >> $TARGET_LOG_LOCATION 2>&1
done  
 
echo "The command has been executed. Please check the content of the related collection." >> $TARGET_LOG_LOCATION
  
echo "Script finished on $(date +"%Y-%m-%d %H:%M:%S")" >> $TARGET_LOG_LOCATION
```

## Nasıl Çalışır

<Steps>
  <Step title="MongoDB Bağlantı Bilgilerini Tanımlama">
    MongoDB sunucusuna bağlanmak için gerekli bilgiler ilgili değişkenlere tanımlanır: HOST, PORT, DB\_NAME, USERNAME, PASSWORD ve AUTH\_DB.
  </Step>

  <Step title="Zaman Dilimini Belirleme">
    TIME\_VALUE değişkeni ile son kaç saat öncesine kadar olan kayıtların silineceği belirtilir. Bu değer saat (H) veya gün (D) cinsinden olabilir.
  </Step>

  <Step title="Koleksiyonlar Üzerinde Döngü">
    Script, üç koleksiyon (`log_apiproxytraffic_policy_execution`, `log_apiproxytraffic`, `log_apiproxytraffic_routing`) üzerinde döngü yaparak her biri için temizleme işlemini gerçekleştirir.
  </Step>

  <Step title="MongoDB Komutlarını Hazırlama ve Çalıştırma">
    Her koleksiyon için belirtilen saat öncesine kadar olan belgeleri bulmak ve silmek için MongoDB komutları tanımlanır ve çalıştırılır.
  </Step>

  <Step title="Sonuç Kontrolü">
    İşlem tamamlandığında, ekrana "The command has been executed. Please check the content of the related collection." mesajı yazdırılır.
  </Step>
</Steps>

## Kullanım

Scripti çalıştırmadan önce MongoDB değişkenlerine kendi bilgilerinizi giriniz. TIME\_VALUE değişkenini istediğiniz saat/gün değerine göre güncelleyebilirsiniz. Örneğin:

* Son 3 saatteki belgeleri korumak ve geri kalanını silmek için `TIME_VALUE=3H`
* Son 5 gündeki belgeleri korumak ve geri kalanını silmek için `TIME_VALUE=5D`

Scripti Linux tabanlı bir işletim sisteminde çalıştırmak için:

1. Bir metin düzenleyici (vi, nano vb.) yardımıyla script bir dosyaya kopyalanır ve içindeki değişkenler düzenlenir
2. Dosyaya çalıştırma yetkisi verilir: `chmod +x purge_trace_logs.sh`
3. Dosya çalıştırılır: `./purge_trace_logs.sh`

Uzun sürecek bir işlem yapacağınızı düşünüyorsanız komut sonuna boşluk bırakıp `&` karakterini ekleyerek arkaplanda çalışmasını sağlayabilirsiniz:

```bash theme={null}
chmod +x /path/to/purge_trace_logs.sh
./path/to/purge_trace_logs.sh &
```

Bu işlem manuel yapılabileceği gibi belirli aralıklarda tekrarlanarak da yapılabilir. Tekrarlanarak yapılması için linux cronjob ayarlarına bu kaydın girilmesi gerekir.

## CronJob Kullanımı

<Steps>
  <Step title="Cron Düzenleyicisini Açma">
    Terminalde aşağıdaki komutu çalıştırarak cron düzenleyicisi açılır:

    ```bash theme={null}
    crontab -e
    ```
  </Step>

  <Step title="Cron Job Ekleme">
    Açılan editöre, scripti ne sıklıkla çalıştırmak istediğinize göre bir satır ekleyin.

    Örneğin, her gün saat 23:59'da çalıştırmak için:

    ```bash theme={null}
    59 23 * * * /path/to/purge_trace_logs.sh > /path/to/logfile.log 2>&1
    ```
  </Step>

  <Step title="Kaydetme">
    Eklediğiniz satırı kaydetmek için Esc tuşuna basıp :wq yazıp enter tuşuna basın.
  </Step>
</Steps>

<Info>
  Script içerisinde belirttiğiniz zaman dilimine göre veri temizleme işlemi gerçekleşecektir. Bu nedenle, script içerisindeki zaman diliminin ve cron ile belirlediğiniz tetikleme saatinin tutarlı olmasını sağlamak önemlidir.
</Info>
