Squid Log To MySQL Database

Selamlar ;

Uzun süredir Proxy loglarını raporlamak için ” Lightsquid” kullanıyordum ama istediğim özellikleri tam anlamıyla karşılamadığı için yeni arayışlar içersine girmiştim.Aslında bu logları MySQL yazdırmak ve arşivlemek bu iş için fena bir fikir değildi.Neyse, elleri sıvadım ve kodu yazmaya başlayacaktım ki! Aklıma şu ata sözü geldi. Amerika’yı yeniden kefşetmeye gerek yok.Belki birileri bu konuda bir çalışma yapmıştır dedim ve  ” Adam Delves ” arkadaşın yaptığı PHP bir scripte rastladım. Açıkcası benim işimi tam anlamıyla çözdü diyemem çünkü log dosyasındaki bir kaç noktadaki değerleri almıyor.Mesela User tablosu var buraya IP adreslerini veya kullanıcıları yazması gerekirken değerler her seferinde NULL geliyor.Şuan için bakma şansım olmadı, ama notlarıma düşmek adına sizlerle aşağıdaki dosyanın orjinal halini paylaşıyorum.Eğer ki, geliştirme şansım olursa geliştirdiğim dosyayıda sizlerle paylaşacağım.Siz benden önce bu değişikliği yaparsanız, bana mail atarsaniz çok sevindirik olurum hani : )

Örnek aldığım loglar ;

ghosts

 

 
SQL

CREATE TABLE access_log (
	Id MEDIUMINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
	Time INTEGER UNSIGNED NOT NULL,
	Elapsed SMALLINT UNSIGNED NOT NULL,
	RemoteHost INTEGER UNSIGNED NOT NULL,
        HttpCodeId TINYINT UNSIGNED NOT NULL,
        StatusId TINYINT UNSIGNED NOT NULL,
	BytesTx INTEGER UNSIGNED NOT NULL,
	MethodId TINYINT UNSIGNED,
	SchemeId TINYINT UNSIGNED,
	HostId INTEGER UNSIGNED,
	PortNo SMALLINT UNSIGNED,
	Resource BLOB,
	UserId TINYINT UNSIGNED,
	PeerStatusId TINYINT UNSIGNED,
	PeerHost INTEGER UNSIGNED,
	MimeId SMALLINT UNSIGNED,
	INDEX access_log_time (Time),
	INDEX user_log_time (UserId));	

CREATE TABLE mime_types (
	MimeId SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
	MimeName VARCHAR(255) UNIQUE NOT NULL);

CREATE TABLE status (
	StatusId TINYINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
	StatusName VARCHAR(30) UNIQUE NOT NULL);

CREATE TABLE peer_status (
	PeerStatusId TINYINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
	PeerStatusName VARCHAR(30) UNIQUE NOT NULL);

CREATE TABLE users (
	UserId TINYINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
	UserName CHAR(8) UNIQUE NOT NULL);

CREATE TABLE http_codes (
	HttpCodeId TINYINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
	HttpCode CHAR(3) UNIQUE NOT NULL,
	Description VARCHAR(30));

CREATE TABLE hosts (
	HostId INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
	HostName VARCHAR(255) UNIQUE NOT NULL);

CREATE TABLE schemes (
	SchemeId TINYINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
	SchemeName CHAR(10) UNIQUE NOT NULL);

CREATE TABLE http_methods (
	MethodId TINYINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
	MethodName VARCHAR(15) UNIQUE NOT NULL);

PHP

#!/usr/local/bin/php_cli
://:/	*/
	$regexp = "/^([a-zA-Z]+):\/\/(([A-Za-z]|[0-9]|\.)+)(:([0-9]+))?(\/(\S+))?/";

	$array_schemes = Array ('http', 'gropher', 'ftp');
		
	if (preg_match ($regexp, $url, $matches) && 
	    in_array($matches[1], $array_schemes)) {
	 		
		return Array ('scheme' => $matches[1],
		              'host' => $matches[2],
			      'port' => $mathes[5],
			      'res' => '/' . $matches[7]);
  	} else

	return false;				     
}

/* this function attempts to split a string representing a socket pair into a an array of the form:

   Array ('host', 'port')

   returns false if it fails  
   */
function split_socket_pair ($spair)
{
	 /* regular expression to match socket pair in form
	   :
	 */
	 $regexp = "/^(([A-Za-z]|[0-9]|\.)+):([0-9]+)$/";

	 if (preg_match ($regexp, $spair, $matches))
		return Array ('host' => $matches[1], 'port' => $matches[3]);
	 else
	 	return false;
}

/* sometimes an insert query may fail - this is not a big deal. But the offending log entry should be copied to the
   log file and an error be printed 
   */
function insert_query_error ($query, $line) {
	/* write to standard error */
	fwrite (STDERR, "Error executing query: $query\n" .
	                'Mysql said:' . mysql_error() . "\n");
	
	/* append log entry to dump file */		
	fputs ($GLOBALS['dumpfile'], $line);
}

/* a fall over gracefully function:
   
   if an error occurs anwhere in the script which COULD result in incrorect data in the tables
   this function copies all remaining log entries to the dump file and exits with an error 
   */
function fatal_query_error ($query) {
	/* write info to log file */
	fwrite (STDERR, "Fatal Error executing query: $query\n" .
	                'Mysql said:' . mysql_error() . "\n");
	
	/* transfer the remaining log entries into the dump file */
	for ($count = $GLOBALS['count']; $count < count($GLOBALS['array_file']); $count++)
		fputs ($GLOBALS['dumpfile'], $GLOBALS['array_file'][$count]);

	@fclose ($GLOBALS['dumpfile']);
	@mysql_close();

	/* terminate script */
	exit;
}
?>

Benzer Yazılar

Henüz yorum yapılmamış

Yorum Yazın

Su elementleri kullanabilirsiniz : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>


+ dokuz = onsekiz

Arama
RSS
Beni yukari isinla