Bazı durumlarda, geliştirdiğiniz projenin kapsamına göre sql sorgularını loglamak isteyebilirsiniz. Beklenmeyen bir işlem sonucunda verilerinizde bir değişiklik olmuş olabilir ve çalıştırılan sql sorgularını incelemeniz gerekebilir. Codeigniter web frameworkü, mevcut log kütüphanesi ile yalnızca SQL kaynaklı database hatalarında, hatayı döndüren sorguyu loglar. Tüm sorguları loglamaz.

Bu yazımda sizlere Codeigniter bünyesindeki query builder ile çalıştırılan tüm sql sorgularını nasıl loglayacağımızı anlatacağım. Bu işlem için frameworkün hooks özelliğinden faydalanacağız.

1) Öncelikle "application/hooks" dizini içerisine "db_log.php" adında bir dosya oluşturup içine aşağıdaki kodları yazıyoruz;

application/hooks/db_log.php

class Db_log
{
 function log_queries()
 {
  $CI  =& get_instance();
  $times    = $CI->db->query_times;
  $queries   = $CI->db->queries;

  if (count($queries) > 0) {
   // File Helper Included
   $CI->load->helper('file');

   // File Name
   $filename = 'query-log-' . date('Y-m-d') . '.txt';

   foreach ($queries as $key => $query) {
    $output = "========== " . date('Y-m-d H:i:s') . " ==========\n";
    $output .= $query . "\n";
    $output .= "========== Execution Time: " . round(doubleval($times[$key]), 3) . " ==========\n\n";
    write_file(APPPATH . '/logs/queries/' . $filename, $output, 'a+');
   }
  }
 }
}

Yukarıdaki kodda yapılanları biraz açıklayalım;

- Db_log adında bir nesne oluşturduk,
- Database nesnesine erişip yapılan sorguları ve bu sorguların çalıştırılma sürelerini aldık,
- Eğer çalıştırılan bir sorgu var ise bir döngü ile her birine teker teker eriştik.
- Log dosyamızı kaydetmek için "file" helperını dahil ettik.
- Tüm sorgular için ilgili tarihi, sorgu cümlesini ve çalıştırılma süresini dosyaya yazdık.

2) Oluşturduğumuz hooku çalıştırmak için "application/config" dizininde bulunan "hooks.php" dosyasını açıyoruz ve aşağıdaki kodu ekliyoruz.

application/config/hooks.php

$hook['post_controller'] = array(
    'class'     => 'Db_log', // Oluşturulan nesnenin adı
    'function'  => 'log_queries', // Nesne içerisinde çalıştırılacak fonksiyonun adı
    'filename'  => 'db_log.php', // Hook dosyası
    'filepath'  => 'hooks' // Hook dosyasının bulunduğu dizin
);

3) Son olarak da "application/config" dizininde, genel ayarlarımızın bulunduğu "config.php" dosyasındaki "enable_hooks" değerini "TRUE" yapıyoruz;

$config['enable_hooks'] = TRUE;

Böylelikle, uygulama çalışırken yapılan tüm sql sorguları, "logs/queries" dizini altında, her bir güne ait ayrı dosyalarda olmak üzere loglanacaktır.