Skip to content

Instantly share code, notes, and snippets.

@louisl
Created October 25, 2017 23:19
Show Gist options
  • Save louisl/7c9cfaf7e7f962e2483cc4a4e44c2768 to your computer and use it in GitHub Desktop.
Save louisl/7c9cfaf7e7f962e2483cc4a4e44c2768 to your computer and use it in GitHub Desktop.
CodeIgniter 3 Log extension
<?php
/**
* CodeIgniter core extension
*
* @package CodeIgniter
* @author Louis Linehan <[email protected]>
* @copyright 2017 Louis Linehan
* @license https://opensource.org/licenses/MIT MIT
* @filesource
*/
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* MY Log
*
* This adds HTTP_REFERER, REQUEST_URI, REMOTE_ADDR to the end of the log message.
*
* @package CodeIgniter\application\core
* @author Louis Linehan <[email protected]>
*/
class MY_Log extends CI_Log {
/**
* Class constructor
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Write Log File
*
* Generally this function will be called using the global log_message() function
*
* @param string $level The error level: 'error', 'debug', 'info' or 'all'
* @param string $msg The error message
*
* @return boolean
*/
public function write_log($level, $msg)
{
if ($this->_enabled === FALSE)
{
return FALSE;
}
$level = strtoupper($level);
if (( ! isset($this->_levels[$level]) OR ($this->_levels[$level] > $this->_threshold))
&& ! isset($this->_threshold_array[$this->_levels[$level]]))
{
return FALSE;
}
$filepath = $this->_log_path . 'log-' . date('Y-m-d') . '.' . $this->_file_ext;
$message = '';
if ( ! file_exists($filepath))
{
$newfile = TRUE;
// Only add protection to php files
if ($this->_file_ext === 'php')
{
$message .= "<?php defined('BASEPATH') OR exit('No direct script access allowed'); ?>\n\n";
}
}
if ( ! $fp = @fopen($filepath, 'ab'))
{
return FALSE;
}
flock($fp, LOCK_EX);
// Instantiating DateTime with microseconds appended to initial date is needed for proper support of this format
if (strpos($this->_date_fmt, 'u') !== FALSE)
{
$microtime_full = microtime(TRUE);
$microtime_short = sprintf('%06d', ($microtime_full - floor($microtime_full)) * 1000000);
$date = new DateTime(date('Y-m-d H:i:s.' . $microtime_short, $microtime_full));
$date = $date->format($this->_date_fmt);
}
else
{
$date = date($this->_date_fmt);
}
// Changed this to also output the referer and url if found.
$referer = ! empty($_SERVER['HTTP_REFERER']) ? ' HTTP_REFERER "' . $_SERVER['HTTP_REFERER'] . '"' : '';
$request_uri = ! empty($_SERVER['REQUEST_URI']) ? ' REQUEST_URI "' . $_SERVER['REQUEST_URI'] . '"' : '';
$ip_address = ! empty($_SERVER['REMOTE_ADDR']) ? ' REMOTE_ADDR "' . $_SERVER['REMOTE_ADDR'] . '"' : '';
$message .= $this->_format_line($level, $date, $msg . $request_uri . $referer . $ip_address);
for ($written = 0, $length = self::strlen($message); $written < $length; $written += $result)
{
if (($result = fwrite($fp, self::substr($message, $written))) === FALSE)
{
break;
}
}
flock($fp, LOCK_UN);
fclose($fp);
if (isset($newfile) && $newfile === TRUE)
{
chmod($filepath, $this->_file_permissions);
}
return is_int($result);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment