Skip to content

Instantly share code, notes, and snippets.

@sevir
Created January 31, 2015 23:12
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sevir/bbfa3b66dae047978696 to your computer and use it in GitHub Desktop.
Save sevir/bbfa3b66dae047978696 to your computer and use it in GitHub Desktop.
CodeIgniter/Creamture Log Viewer
<?php
/**
* Enhaced Log viewer for CodeIgniter
* SeViR @2015
* based in old version of 2010
*/
class Viewer{
//Please for security set your external ip
private static $allow_ips = array(
'127.0.0.1',
'84.124.50.10'
);
//default logs path
private static $log_path = '../application/logs/';
private static $initialized = false;
public static $assets = array(
'error_icon' => 'data:image/gif;base64,R0lGODlhEAAQAPQfAOaQhNFiTfrUzPrq5vWEZ/KnmfN9YedxW+3FvPCXhOmJe8NPNuySheKmmctZQ/ePd+uBa/i0ovOypvSupO94Xviiifq8qPrAs+NgVN19b96hle+fkuuvov///+doWQAAACH5BAUAAB8ALAAAAAAQABAAQAWV4CeOZClSkUGtQue9XuGIw5NYBNF1hmEph8EIEVBMFC9FIbNAlAQPSCESKUAgAtKjUOkZdqsDI3EQSQ6Rw2uHaRcCjdKgEVgsHBqh6TO4PHIPF3okAgQ3FTkVFgwHWSIXEDgEXx0rKAccJxGTKzsHagcyIhAbCRSfGxMvGAoAATQHRi8MDG4ZDoMfRAEAGxuuTXvCJCEAOw%3D%3D',
'load_icon' => 'data:image/gif;base64,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',
'debug_icon' => 'data:image/gif;base64,R0lGODlhEAAPAMQfAP3shv/12vvcS+vCc/vgXt6yPOvFeuuiJ+uaFOvLivraQuvJhfzhY+upN+ueHPvdUuvAbvzfWvveVv70zuu+aeu3Wbx8EuuwR/3vof7xsv3umP7yv/ziZv/24////////yH5BAEAAB8ALAAAAAAQAA8AAAVz4CeOn+eRKOklyZmqSdct7ustHcd1Ro16htyO4hsBhRxGoFIsDXIFC2NyKXqeuighsmn4PJAcIxqRZA61q5ixlTwEGLQI3GGwo2+BxnE62tt5CgoAfEABARMTGxkZGBoAkHwlFBUXDQcOCJqbaSaenyYiIQA7',
'info_icon' => 'data:image/gif;base64,R0lGODlhEAAQAPU/AD5xtKvE4Xqlx6bC3YWr0+Tr9LvL4mmVwz1XkZ282klhlI2qzZC00muYxVJronKdzGih1P7//1uc06K+3LLJ5ZuqyF2Esr3T6NDc6kaKxXahz3mk0maQvk2Rz1R7rZ674JKz2uPo78bd8vT3++bw+Up3tL3G2Yyy2fX4+5i001uKuVKQxZO41Juu0pe62GKKuWiTwWKXyH2p1tTg7miczTxco6HG5KTJ56jM6khmo3KWvnidxDyDwaC/4F6Rv////yH5BAUAAD8ALAAAAAAQABAAQAavwJ9wSCwKeRRNo3GYjThQWAAhJElOFNkmENBsJoRSYWioCRK7l0WXEiBMRZEE0uN+YpkLUfIBaR4PExNLDQQuDkIJPgEHMAYRERgWFikeFUUhFQ4ICA4VIUZVOBAdHRI2JEYiHScGHwQEIAEEAHpCNzQUGxoaIyiAGgMqLUIZug9LkI0wDQE1QisJBEwwTi/XOyyIPwUlBBMcLyqTFgsCCqBkORYsAwMMHgpwofRDQQA7',
'favicon' => 'data:image/png;base64,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'
);
private function __construct() {}
private static function initialize()
{
if (self::$initialized)
return;
self::disable_ob();
if (file_exists(dirname( __FILE__).'/system/logs/')){
self::$log_path = dirname( __FILE__).'/system/logs/';
}else if (file_exists(dirname( __FILE__).'/../application/logs/')){
self::$log_path = dirname( __FILE__).'/../application/logs/';
}
self::$initialized = true;
}
//reads all log file
public static function readLog($file){
self::initialize();
echo '<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet">';
echo '<style>pre:empty, pre:nth-of-type(1){ display:none; }body{margin: 60px 20px 20px 20px;}</style>';
if(strpos($file, './') !== FALSE) die('invalid access');
if (file_exists(self::$log_path.$file)){
echo '<pre>'.str_replace(
array(
'ERROR -',
'INFO -',
'DEBUG -'
),
array(
'</pre><pre class="alert alert-warning"><img alt="error" src="'.self::$assets['error_icon'].'" />',
'</pre><pre class="info"><img alt="info" src="'.self::$assets['info_icon'].'" />',
'</pre><pre class="debug"><img alt="debug" src="'.self::$assets['debug_icon'].'" />',
),file_get_contents(self::$log_path.$file)
).'</pre>';
}
}
//Check if you access from a valid IP
public static function checkAccess(){
self::initialize();
return in_array($_SERVER['REMOTE_ADDR'], self::$allow_ips);
}
//rename the old logfile
public static function clearLog(){
self::initialize();
$the_file = 'log-'.date('Y-m-d').'.php';
if (file_exists(self::$log_path.$the_file)) rename(self::$log_path.$the_file,self::$log_path.str_replace('.php', '', $the_file).'_'.date('Gis').'.php');
header('Location: '.str_replace('?'.$_SERVER['QUERY_STRING'], '', $_SERVER['REQUEST_URI']));
}
//compress logs in a ZipFile and it removes them
public static function compressLogs(){
self::initialize();
$log_files = glob(self::$log_path.'*.php');
$zip = new ZipArchive();
$zip->open(self::$log_path.'backup_'.date('Y-m-d').'_'.date('Gis').'.zip',ZIPARCHIVE::OVERWRITE);
foreach($log_files as $file) {
$zip->addFile($file,str_replace(dirname($file), '', $file));
}
$zip->close();
foreach($log_files as $file) {
unlink($file);
}
header('Location: '.str_replace('?'.$_SERVER['QUERY_STRING'], '', $_SERVER['REQUEST_URI']));
}
//compress logs and download it
public static function downloadLogs(){
self::initialize();
$log_files = glob(self::$log_path.'*.php');
$zipname = self::$log_path.'backup_'.date('Y-m-d').'_'.date('Gis').'.zip';
$zip = new ZipArchive();
$zip->open($zipname,ZIPARCHIVE::OVERWRITE);
foreach($log_files as $file) {
$zip->addFile($file,str_replace(dirname($file), '', $file));
}
$zip->close();
header('Content-disposition: attachment; filename='.str_replace(dirname($zipname), '', $zipname));
header('Content-type: application/octet-stream');
readfile($zipname);
unlink($zipname);
}
//download a zip log backup file
public static function downloadFile($file){
self::initialize();
if((strpos($file, './') !== FALSE) || (strpos($file,'.zip') === FALSE)) die('invalid access');
header('Content-disposition: attachment; filename='.$file);
header('Content-type: application/octet-stream');
readfile(self::$log_path.$file);
}
//get list of logs and zip backups
public static function getFiles(){
$log_files = glob(self::$log_path.'*.php');
usort(
$log_files,
create_function('$a,$b', 'return filemtime($b) - filemtime($a);')
);
$backups_files = glob(self::$log_path.'*.zip');
usort(
$backups_files,
create_function('$a,$b', 'return filemtime($b) - filemtime($a);')
);
return array(
'logs'=> $log_files,
'backups'=> $backups_files
);
}
//hide progress
public static function stopProgress(){
?>
<script type="text/javascript">
window.top.document.getElementById('progress').style.display = 'none';
window.scrollTo(0,document.body.scrollHeight);
</script>
<?php
}
public static function disable_ob() {
// Turn off output buffering
ini_set('output_buffering', 'off');
// Turn off PHP output compression
ini_set('zlib.output_compression', false);
// Implicitly flush the buffer(s)
ini_set('implicit_flush', true);
ob_implicit_flush(true);
// Clear, and turn off output buffering
while (ob_get_level() > 0) {
// Get the curent level
$level = ob_get_level();
// End the buffering
ob_end_clean();
// If the current level has not changed, abort
if (ob_get_level() == $level) break;
}
// Disable apache output buffering/compression
if (function_exists('apache_setenv')) {
apache_setenv('no-gzip', '1');
apache_setenv('dont-vary', '1');
}
}
public static function realtime(){
echo '<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet">';
?>
<style type="text/css">pre:empty, pre:nth-of-type(1){ display:none;}body{margin: 60px 20px 20px 20px;}</style>
<script type="text/javascript">
setInterval(function(){
window.scrollBy(0,200);
}, 300);
</script>
<?php
$the_file = self::$log_path.'log-'.date('Y-m-d').'.php';
if ( file_exists($the_file)){
ini_set('max_execution_time', 0);
$lastpos = 0;
while (true) {
usleep(300000); //0.3 s
clearstatcache(false, $the_file);
$len = filesize($the_file);
if ($len < $lastpos) {
//file deleted or reset
$lastpos = $len;
}
elseif ($len > $lastpos) {
$f = fopen($the_file, "rb");
if ($f === false)
die();
fseek($f, $lastpos);
while (!feof($f)) {
$buffer = fread($f, 4096);
echo '<pre>'.str_replace(
array(
'ERROR -',
'INFO -',
'DEBUG -'
),
array(
'</pre><pre class="alert alert-warning"><img alt="error" src="'.self::$assets['error_icon'].'" />',
'</pre><pre class="info"><img alt="info" src="'.self::$assets['info_icon'].'" />',
'</pre><pre class="debug"><img alt="debug" src="'.self::$assets['debug_icon'].'" />',
),$buffer
).'</pre>';
flush();
}
$lastpos = ftell($f);
fclose($f);
}
}
}else{
echo 'No today log found';
}
}
}
if (!Viewer::checkAccess()) die('Your IP ('.$_SERVER['REMOTE_ADDR'].') is not allowed');
if (isset($_GET['q'])){
$query = $_GET['q'];
switch ($query) {
case 'phpinfo':
echo '<style>body{margin: 60px 20px 20px 20px;}</style>';
phpinfo(); Viewer::stopProgress(); die();
break;
case 'file':
if(isset($_GET['f'])){
Viewer::readLog($_GET['f']);
}
Viewer::stopProgress();
die();
break;
case 'download':
if(isset($_GET['f'])){
Viewer::downloadFile($_GET['f']);
}
die();
break;
case 'clear':
Viewer::clearLog();
die();
break;
case 'downloadzip':
Viewer::downloadLogs();
die();
break;
case 'backup':
Viewer::compressLogs();
die();
break;
case 'realtime':
Viewer::realtime();
flush();
die();
break;
default:
echo "no action available";Viewer::stopProgress();die();
break;
}
}
$files = Viewer::getFiles();
//And now the main view
?>
<html>
<head>
<title>Log Viewer for CodeIgniter</title>
<link rel='icon' type='image/png' href='<?php echo Viewer::$assets['favicon'];?>'>
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
<script>
$(function(){
$("a.action").click(function(){
$("#progress").show();
$("#content").attr('src', $(this).attr("data-href") );
});
$("#logfilter, #backupfilter").click(function(){
return false;
}).keyup(function(){
if(this.value==''){
$("#"+this.id+" div").show();
}else{
filtertext = this.value;
$("#"+$(this).attr("data-id")+" div").each(function(){
console.log($("a:first",this).html());
console.log(filtertext);
if($("a:first",this).html().indexOf(filtertext) > -1){
$(this).show();
}else{
$(this).hide();
}
});
}
});
});
</script>
<style>
.pr-info{
padding-top: 5px;
padding-left: 10px;
}
.pr-info span{
display: block;
font-size: 9px;
}
#backupfiles div, #logfiles div{
font-size: 10px;
margin-left: 10px;
}
#backupfiles, #logfiles{
max-height: 200px;
}
#content{
position:absolute;
width: 100%;
height: 100%;
border: none;
}
#progress{
display:none;
}
#logfilter, #backupfilter{
margin: 5px 10px;
font-size: 10px;
height: 25px;
}
body{
margin:0;
}
</style>
</head>
<body>
<nav class="navbar navbar-default navbar-fixed-top">
<div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" title="refresh" href="<?=$_SERVER['QUERY_STRING'].$_SERVER['REQUEST_URI']; ?>">Log Viewer for CodeIgniter</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav navbar-fixed">
<li class="pr-info">
<span><strong><?php echo $_SERVER["SERVER_NAME"]?></strong></span>
<span>server ip: <?php echo gethostbyname ( $_SERVER["SERVER_NAME"] )?></span>
<span>my ip: <?php echo $_SERVER['REMOTE_ADDR'];?></span>
</li>
<!-- DEPRECATED
<li><a title="backup and clear this log file" href="<?php echo str_replace('?'.$_SERVER['QUERY_STRING'], '', $_SERVER['REQUEST_URI']).'?q=clear&f=';?>">Clear</a></li>
-->
<li><a title="rename today log and create a new" href="<?php echo str_replace('?'.$_SERVER['QUERY_STRING'], '', $_SERVER['REQUEST_URI']).'?q=clear';?>">Clear</a></li>
<li><a title="compress into a zip file and download all logs" target="_blank" href="<?php echo str_replace('?'.$_SERVER['QUERY_STRING'], '', $_SERVER['REQUEST_URI']).'?q=downloadzip';?>">Download</a></li>
<li><a title="backup into a zip file all logs and removes them" href="<?php echo str_replace('?'.$_SERVER['QUERY_STRING'], '', $_SERVER['REQUEST_URI']).'?q=backup';?>">Backup</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Logs files<span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li>
<a href="#">Log files</a>
<div class="form-group">
<input id="logfilter" data-id="logfiles" type="text" class="form-control" placeholder="Filter for...">
</div><!-- /input-group -->
</li>
<li id="logfiles">
<?php foreach ($files['logs'] as $file): ?>
<div class="filelink"><a class="action log" href="#log" data-href="<?php echo str_replace('?'.$_SERVER['QUERY_STRING'], '', $_SERVER['REQUEST_URI']).'?q=file&f='.basename($file);?>"><?=basename($file)?></a></div>
<?php endforeach ?>
</li>
<li class="divider"></li>
<li>
<a href="#">Backup files</a>
<div class="form-group">
<input id="backupfilter" data-id="backupfiles" type="text" class="form-control" placeholder="Filter for..."/>
</div><!-- /input-group -->
</li>
<li id="backupfiles">
<?php foreach ($files['backups'] as $file): ?>
<div class="filelink"><a target="_blank" href="<?php echo str_replace('?'.$_SERVER['QUERY_STRING'], '', $_SERVER['REQUEST_URI']).'?q=download&f='.basename($file);?>"><?=basename($file)?></a></div>
<?php endforeach ?>
</li>
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Extra info<span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a class="action" href="#phpinfo" data-href="<?php echo str_replace('?'.$_SERVER['QUERY_STRING'], '', $_SERVER['REQUEST_URI']).'?q=phpinfo'?>">Show phpinfo()</a></li>
</ul>
</li>
<li id="progress"><a href="#"><img src="<?php echo Viewer::$assets['load_icon'];?>"></a></li>
</ul>
</div><!-- /.navbar-collapse -->
</div><!-- /.container-fluid -->
</nav>
<div class="">
<iframe id="content" src="<?php echo str_replace('?'.$_SERVER['QUERY_STRING'], '', $_SERVER['REQUEST_URI']).'?q=realtime'?>"></iframe>
</div>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment