<?php

	

	/* Finally, A light, permissions-checking logging class. 

	 * 

	 * Author	: Kenneth Katzgrau < katzgrau@gmail.com >

	 * Date	    : July 26, 2008

	 * Comments	: Originally written for use with wpSearch

	 * Website	: http://codefury.net

	 * Version	: 0.2m

	 *

	 * Usage: 

	 *		$log = new KLogger ( "log.txt" , KLogger::INFO );

	 *		$log->LogInfo("Returned a million search results");	//Prints to the log file

	 *		$log->LogFATAL("Oh dear.");				//Prints to the log file

	 *		$log->LogDebug("x = 5");					//Prints nothing due to priority setting

	*/

	

	class KLogger

	{

		

		const DEBUG 	= 1;	// Most Verbose

		const INFO 		= 2;	// ...

		const WARN 		= 3;	// ...

		const ERROR 	= 4;	// ...

		const FATAL 	= 5;	// Least Verbose

		const OFF 		= 6;	// Nothing at all.

		

		const LOG_OPEN 		= 1;

		const OPEN_FAILED 	= 2;

		const LOG_CLOSED 	= 3;

		

		/* Public members: Not so much of an example of encapsulation, but that's okay. */

		public $Log_Status 	= KLogger::LOG_CLOSED;

		public $DateFormat	= "Y-m-d G:i:s";

		public $MessageQueue;

		private $offset;

		private $log_file;

		private $priority = KLogger::INFO;

		

		private $file_handle;

		

		public function __construct( $filepath , $priority, $offset = 0 )

		{

			if ( $priority == KLogger::OFF ) return;

			

			$this->offset = $offset;

			$this->log_file = $filepath;

			$this->MessageQueue = array();

			$this->priority = $priority;

			

			if ( file_exists( $this->log_file ) )

			{

				if ( !is_writable($this->log_file) )

				{

					$this->Log_Status = KLogger::OPEN_FAILED;

					$this->MessageQueue[] = "The file exists, but could not be opened for writing. Check that appropriate permissions have been set.";

					return;

				}

			}

			

			if ( $this->file_handle = fopen( $this->log_file , "a" ) )

			{

				$this->Log_Status = KLogger::LOG_OPEN;

				$this->MessageQueue[] = "The log file was opened successfully.";

			}

			else

			{

				$this->Log_Status = KLogger::OPEN_FAILED;

				$this->MessageQueue[] = "The file could not be opened. Check permissions.";

			}

			

			return;

		}

		

		public function __destruct()

		{

			if ( $this->file_handle )

				fclose( $this->file_handle );

		}

		

		public function LogInfo($line)

		{

			$this->Log( $line , KLogger::INFO );

		}

		

		public function LogDebug($line)

		{

			$this->Log( $line , KLogger::DEBUG );

		}

		

		public function LogWarn($line)

		{

			$this->Log( $line , KLogger::WARN );	

		}

		

		public function LogError($line)

		{

			$this->Log( $line , KLogger::ERROR );		

		}



		public function LogFatal($line)

		{

			$this->Log( $line , KLogger::FATAL );

		}

		

		public function Log($line, $priority)

		{

			if ( $this->priority <= $priority )

			{

				$status = $this->getTimeLine( $priority );

				$this->WriteFreeFormLine ( "$status $line \n" );

			}

		}

		

		public function WriteFreeFormLine( $line )

		{

			if ( $this->Log_Status == KLogger::LOG_OPEN && $this->priority != KLogger::OFF )

			{

			    if (fwrite( $this->file_handle , $line ) === false) {

			        $this->MessageQueue[] = "The file could not be written to. Check that appropriate permissions have been set.";

			    }

			}

		}

		

		private function getTimeLine( $level )

		{

			

			if ( class_exists( 'DateTime' ) ) {

				$original_time = microtime( true ) + $this->offset;

				$microtime     = sprintf( '%06d', ( $original_time - floor( $original_time ) ) * 1000000 );

				$date          = new DateTime( date( 'Y-m-d H:i:s.' . $microtime, $original_time ) );

				$time          = $date->format( $this->DateFormat );

			

			} else {

				$time          = gmdate($this->DateFormat, time() + $this->offset);

			}

			

			switch( $level )

			{

				case KLogger::INFO:

					return "$time - INFO  -->";

				case KLogger::WARN:

					return "$time - WARN  -->";				

				case KLogger::DEBUG:

					return "$time - DEBUG -->";				

				case KLogger::ERROR:

					return "$time - ERROR -->";

				case KLogger::FATAL:

					return "$time - FATAL -->";

				default:

					return "$time - LOG   -->";

			}

		}

		

	}





?>