code igniter log library
Uzun süredir code igniter ile olan ilişkimiz düzeyli bir şekilde devam ediyor. Her ne kadar kısa bir süre içinde java ile tanışacak olsam da code igniter ile olan ilişkimizin devam edeceğini düşünüyorum.
Baktım ki ci ile ilgili blogumda hiç yazı yok. En iyisimi yapmış olduğum log kütüphanesini yayınlayım da belki bir faydası olur dedim.
Sınıfımın ismi jci! log-v1 yani just code it! log-v1. Bundan sonraki yapacağım sınıfları sanırım jci! ön eki ile çıkaracağım.
Log kütüphanesi temel anlamda sistem içerisinde gerçekleşen aktivitelerin kayıdını tutmakta. Kullanıcının ip, browser, işlem zamanı, id'si, adı-soyadı, işlem yapılan controller ve function kayıtları tutulmaktadır. İsteyen istediği gibi genişletebilir. Tabi emeğe saygıyı unutmamak gerekir
Kod kısmına geçmeden önce veritabanımızda tablomuzu oluşturuyoruz:
CREATE TABLE IF NOT EXISTS `Log` ( `LogId` int(11) NOT NULL AUTO_INCREMENT, `UserId` int(11) NOT NULL DEFAULT '0', `UserName` varchar(255) NOT NULL, `ControllerName` varchar(255) NOT NULL, `FunctionName` varchar(255) NOT NULL, `Action` text NOT NULL, `Time` varchar(16) NOT NULL, `Ip` varchar(32) NOT NULL, `Browser` varchar(255) NOT NULL, PRIMARY KEY (`LogId`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Veritabanını oluşturduktan sonra application->libraries içerisine logging.php dosyası oluşturuyoruz. Aşağıdaki kodu yazıyoruz:
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
*
* jci!(just code it!) log-v1.0
*
* Sistemin genelinde kullanicilarin aktivitelerini veritabanina yazdirir
* @abstract
*
* @package CodeIgniter
* @author Onur DEGERLI <onur.degerli@derle.com.tr>
* @copyright Copyright (c) 2009
* @version 1.0
*/
class Logging {
var $CI;
/*
* @var time loglama ani
* @static
* */
var $now = "";
/*
* @var string request ip'si
* @static
* */
var $ip = "";
/*
* @var string request browser
* @static
* */
var $browser = "";
/*
* @var string islemin yapildigi controller adi
* @static
* */
var $controller_name = "";
/*
* @var string islemin yapildigi function adi
* @static
* */
var $function_name = "";
/*
* @var string islemi yapan kullanici id'si
* @static
* */
var $user_id = "";
/*
* @var string islemi yapanin kullanici adi
* @static
* */
var $username = "";
function __construct() {
$this->CI =&amp;amp;amp;amp; get_instance();
$this->CI->load->database();
$this->CI->load->helper('url');
}
/*
* set_time()
* loglama anini set'ler
* @abstract
*
* @access private
* */
private function set_time()
{
$this->now = time();
}
/*
* set_browser()
* request'in yapildigi browser bilgisini set'ler
* @abstract
*
* @access private
* */
private function set_browser()
{
$this->browser = $_SERVER['HTTP_USER_AGENT'];
}
/*
* set_ip()
* request'in yapildigi ip'yi set'ler
* @abstract
*
* @access private
* */
private function set_ip()
{
$this->ip = $_SERVER['REMOTE_ADDR'];
}
/*
* set_controller_name()
* request'in yapildigi controller dosyasini set'ler
* url'den 1. segmenti alir
* @abstract
*
* @access private
* */
private function set_controller_name()
{
$this->controller_name = $this->CI->uri->segment(1);
}
/*
* set_function_name()
* request'in yapildigi function dosyasini set'ler
* url'den 2. segmenti alir
* @abstract
*
* @access private
* */
private function set_function_name()
{
$this->function_name = $this->CI->uri->segment(2);
}
/*
* set_user_id()
* islemi yapan kullanicinin id'sini set'ler
* @abstract
*
* @access private
* */
private function set_user_id()
{
$this->user_id = $this->CI->session->userdata('user_id');
}
/*
* set_username()
* islemi yapan kullanicinin id'sine gore adi ve soyadi bilgisini db'den ceker ve set'ler
* @abstract
*
* @access private
* */
private function set_username()
{
$this->CI->db->select(array('name','surname'));
$query = $this->CI->db->getwhere('user', array('user_id'=>$this->user_id), 1, 0);
$row = $query->row();
$this->username = $row->name." ".$row->surname;
}
/*
* insert()
* conroller dosyalarinda loglama yapilacak fonksiyonlarda cagirilarak
* loglama islemini yapan fonksiyondur
* @abstract
*
* @access public
* @return bool
* */
public function insert($action)
{
$this->set_time();
$this->set_browser();
$this->set_ip();
$this->set_controller_name();
$this->set_function_name();
$this->set_user_id();
$this->set_username();
$this->CI->db->query("INSERT log
SET user_id='$this->user_id',username='$this->username',class_name='$this->controller_name',
function_name='$this->function_name',action='$action',time='$this->now',
ip='$this->ip',browser='$this->browser'");
return true;
}
/*
* log_list()
* loglanan verilerin listesini verir
* @abstract
*
* @access public
* @var int $limit
* @var int $offset
* @return mixed
* */
public function log_list($limit,$offset=0)
{
return $this->CI->db->query("
SELECT * FROM log ORDER BY log_id DESC LIMIT $offset,$limit
");
}
}
Daha sonra application->config->autoload.php içerisinde $autoload['libraries'] satırını bulup dizi içerisine 'logging' ekliyoruz.
Ardından hangi controller sınıfında çalıştıracaksak o sınıfın istenilen fonksiyonuna $this->logging->insert("$duyuru_id 'li duyuru silindi!"); kodunu ekliyoruz. Bu sayede log sınıfımızdaki insert fonksiyonuna yaptığımız açıklamayı yolluyoruz ve fonksiyon içinde veritabanına ekleme işlemini yapıyoruz.
Admin isimli kullanıcının sisteme giriş yaptığı andaki işlemi kaydedersek veritabanımızdaki tablomuzda ilgili kayıt şu şekilde olacaktır:
(1, 1, 'admin', 'adminlogin', 'login', 'Sisteme giriş yapıldı.', '1259735767', '192.168.1.148', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)')
İşte bu kadar. Umarım işinize yarar. Tavsiyelerinizi, yorumlarınızı bekliyorum. İyi çalışmalar.
Not: Fatih Bazman'ın blogundaki ci yazıları ile esin kaynağı olduğu için kendisine teşekkür ederim. codeigniter.gen.tr
Comments(7)
Teşekkürler. CI ile ilgili yazılarınızın devamını bekleriz.
Log tutma işlemi için düşündüğün controller ve method adı tutma yaklaşımın çok doğru bir yaklaşım olmuş. Benimde bir süredir yapmayı düşündüğüm log tutma sınıfı için senin kütüphanen işime yarayacak. Teşekkür ederim.
@fatih işe yarıyorsa mutlu olurum.
controller ve method tutma ile hangi sayfada işlem yapılıyor kolayca tutulmuş olacaktır. ayrıca her controller sayfasında insert metoduna ayrıca controller ve method adını yazmaya gerek kalmayacaktır böylece. amacım controller tarafında minimum iş, library'de ise maksimum kayıt sağlamaktı. sanırım temel anlamda bu işlemleri karşılıyor.
Eline sağlık güzel olmuş
kendime göre biraz uyarlayıp kullandım
Kardeş, iyi güzel yapmışsında bir download linki felan koysaydın keşke, kopyala yapıştır yaparken rakamları temizlemek zor oluyor
@Süleyman içerisinde kod olan yazılarımda genelde öyleydi ama bunda atlamışım sanırım
böyle idare edin şimdilik napalım
Elinize sağlık.