Location: PHPKode > scripts > XLog > xlog/class.XLog.php
<?php
/**
* class XLog
*
* The XLog is a PHP 5 oriented object class to log messages into one or multiple files.
* 
* @category   Log
* @author     Costin Trifan <hide@address.com>
* @copyright  2009 Costin Trifan
* @licence    MIT License http://en.wikipedia.org/wiki/MIT_License
* @version    1.0
* 
* Copyright (c) 2009 Costin Trifan <http://june-js.com/>
* 
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
* 
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
* 
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
class XLog
{
	private function __clone() {}
	private function __wakeup() {}

	protected
		$log_file 	= '',	# The absolute path to the log file.
		$message 	= '',	# The message to write into the log file
		$line		= '',	# The line where the error has occurred [ ie: __LINE__ ]
		$file 		= '';	# The file where the error has occurred [ ie: __FILE__ ]

	# Error messages
	protected
		$error_file_not_found 	= "Error: Although you have enabled error logging, the log file could not be found!",
		$error_file_open 		= "Error: Couldn't open the log file. Check for permissions!",
		$error_no_message 		= "Error: The content to write into the log file is missing...";



	# .ctor
	/**
	* Constructor
	*
	* @param string $log_file The absolute path to the log file.
	*/
	public function __construct( $log_file='' )
	{
		$this->SetLogFile($log_file);
	}


	/**
	* Set the active log file.
	*
	* @access private
	* @return void
	*/
	private function SetLogFile( $log_file='' )
	{
		if ($log_file)
			$this->log_file = $log_file;
	}


	/**
	* Check to see whether or not the log file exists.
	*
	* @access private
	* @return boolean
	*/
	private function FileExists( $log_file )
	{
		return file_exists($log_file);
	}


	/**
	* Clear the log file
	*/
	public function Clear( $log_file='' )
	{
		if (!$log_file)
			$log_file = $this->log_file;

		if (!$this->FileExists($log_file))
			$this->ExitWithError($this->error_file_not_found);
	
		if (($h = fopen($log_file, "w")) !== FALSE)
			fclose($h);
		else
			$this->ExitWithError($this->error_file_open);
	}


	/**
	* Show the content from the log file
	*
	* @param string $log_file The absolute path to the log file.
	* @return string
	*/
	public function GetContent( $log_file='' )
	{
		if (!$log_file)
			$log_file = $this->log_file;

		if (!$this->FileExists($log_file))
			$this->ExitWithError($this->error_file_not_found);

		# Check if the file is php; if it is, remove php's tags and comments
		$info = pathinfo($log_file);
		$file_extension  = strtoupper($info['extension']);


		if (($h = @fopen($log_file, "r")) !== FALSE)
		{
			# Get content
			$content = file_get_contents($log_file);
			@fclose($h);

			if ($file_extension == 'PHP')
			{
				$begin_file = '<?php /*';
				$end_file 	= '*/ ?>';

				$content_length 	= strlen($content);
				$begin_file_length 	= strlen($begin_file);
				$end_file_length 	= strlen($end_file);
				# Strip php's tags and comments
				$content 			= substr($content, $begin_file_length, -$end_file_length);
			}
		}
		return html_entity_decode($content, ENT_QUOTES, "UTF-8");
	}


	/**
	* Write into the log file
	*
	* @param string $message The message to write into the log file.
	* @param string $file  The file where the error has occurred [ ie: __FILE__ ].
	* @param number $line The line where the error has occurred [ ie: __LINE__ ].
	* @param boolean $clear_before Whether or not to delete the existent content from the log file before writting the new one.
	* @param string $log_file The absolute path to the log file.
	*
	* @return void
	*/
	public function Write($message='', $file=NULL, $line=NULL, $clear_before=FALSE, $log_file='')
	{
		if (!$message) $this->ExitWithError($this->error_no_message);
	
		# Setup arguments
		$this->message  = htmlentities($message, ENT_QUOTES, "UTF-8");
		$this->file		= $file;
		$this->line		= $line;
	
		if ($log_file)
			$this->log_file = $log_file;

		if (!$this->FileExists($this->log_file))
			$this->ExitWithError($this->error_file_not_found);

		if ($clear_before)
			$this->Clear($this->log_file);

		# Detect the file's extension so the appropriate function can be called
		$info = pathinfo($this->log_file);
		$file_extension  = strtoupper($info['extension']);

		switch ($file_extension)
		{
			case 'INI' 	: $this->WriteIni(); break;
			case 'PHP' 	: $this->WritePhp(); break;
			default 	: $this->WriteAny(); break;
		}
	}


	/**
	* Write log into an ini file
	*
	* @access protected
	*/
	protected function WriteIni()
	{
		if (($h = fopen($this->log_file, "r+")) !== FALSE)
		{
			$initial_content = file_get_contents($this->log_file);
		
			$br = "\r\n";
			$content  = $br.";---------------------------------------------------------------------------------------".$br;
			$content .= "Date \t= ".date("M d Y H:i:s", time()).$br;
			$content .= "IP \t= ".$_SERVER['REMOTE_ADDR'].$br;
			$content .= "Page \t= ".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].$br;
			$content .= "File \t= ".$this->file.$br;
			$content .= "Line \t= ".$this->line.$br;
			$content .= "Error \t= ".$this->message.$br;
			$content .= ";---------------------------------------------------------------------------------------".$br;
			$content .= $br.$initial_content;

			$content = trim($content);
			@fwrite($h, $content, strlen($content));
			@fclose($h);
		}
		else $this->ExitWithError($this->error_file_open);
	}


	/**
	* Write log into a php file
	*
	* @access protected
	*/
	protected function WritePhp()
	{
		if (($h = fopen($this->log_file, "r+")) !== FALSE)
		{
			$br 		= "\r\n";
			$begin_file = '<?php /*';
			$end_file 	= '*/ ?>';

			$initial_content = trim(file_get_contents($this->log_file));

			$content_length 	= strlen($initial_content);
			$begin_file_length 	= strlen($begin_file);
			$end_file_length 	= strlen($end_file);
			# Strip php's tags and comments
			$initial_content 	= substr($initial_content, $begin_file_length, -$end_file_length);


			$content  = "[".date("M d Y H:i:s", time())."]".$br;
			$content .= "---------------------------------------------------------------------------------------".$br;
			$content .= "IP: \t".$_SERVER['REMOTE_ADDR'].$br;
			$content .= "Page: \t".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].$br;
			$content .= "File: \t".$this->file.$br;
			$content .= "Line: \t".$this->line.$br;
			$content .= "Error: \t".$this->message.$br;
			$content .= "---------------------------------------------------------------------------------------".$br;
			$content .= $initial_content;

			$content = trim($content);
			$content = $begin_file.$br.$content.$br.$end_file;
			@fwrite($h, $content, strlen($content));
			@fclose($h);
		}
		else $this->ExitWithError($this->error_file_open);
	}


	/**
	* Write log into any other file type
	*
	* @access protected
	*/
	protected function WriteAny()
	{
		if (($h = fopen($this->log_file, "r+")) !== FALSE)
		{
			$initial_content = file_get_contents($this->log_file);
		
			$br = "\r\n";
			$content  = "[".date("M d Y H:i:s", time())."]".$br;
			$content .= "---------------------------------------------------------------------------------------".$br;
			$content .= "IP: \t".$_SERVER['REMOTE_ADDR'].$br;
			$content .= "Page: \t".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].$br;
			$content .= "File: \t".$this->file.$br;
			$content .= "Line: \t".$this->line.$br;
			$content .= "Error: \t".$this->message.$br;
			$content .= "---------------------------------------------------------------------------------------".$br;
			$content .= $br.$initial_content;

			$content = trim($content);
			@fwrite($h, $content, strlen($content));
			@fclose($h);
		}
		else $this->ExitWithError($this->error_file_open);
	}


	/**
	* Get the size of the log file.
	* Original source code: http://www.php.net/manual/en/function.filesize.php#84034
	*
	* @return string
	*/
	public function GetFileSize( $log_file='', $round=0 , $add_space=TRUE)
	{
		if (!$log_file)
			$log_file = $this->log_file;

		$size 	= filesize($log_file);
		$sizes 	= array('B', 'KB', 'MB', 'GB');
		$total 	= count($sizes);

		for ($i=0; $size > 1024 && $i < $total; $i++)
			$size /= 1024;

		if ($add_space)
			return round($size,$round).' '.$sizes[$i];
		else
			return round($size,$round).$sizes[$i];
	}


	/**
	* Display the error message
	*
	* @param string $error_message The message to be displayed in case of an error.
	* @access protected
	* @return void
	*/
	protected function ExitWithError( $error_message='' )
	{
		exit("<strong>".$error_message."</strong>");
	}

}
// >> END class XLog
?>
Return current item: XLog