<?php
/**
* @file qtrLogger.php
* @brief plugin logger implementation
*
*
* @author Quttera (qtr),
[email protected]
*
* @internal
* Created 01/14/2016
* Compiler gcc/g++
* Company Quttera
* Copyright Copyright (c) 2016, Quttera
*
* This source code is released for free distribution under the terms of the
* GNU General Public License as published by the Free Software Foundation.
* =====================================================================================
*/
require_once('qtrConfig.php');
require_once('qtrOptions.php');
define( 'QTR_LOGGER','quttera_wp_logger');
class CQtrLogger
{
protected $_log_cache;
protected $_severity;
protected $_config;
protected $_max_lines;
protected $_is_cli;
protected $_log_file;
protected $_log_file_name;
public function __construct()
{
$this->_config = new CQtrConfig();
$this->_severity = $this->_config->LogSeverity();
$this->_max_lines = 20;
$this->_log_file = null;
if (php_sapi_name() == "cli") {
$this->_is_cli = TRUE;
} else {
$this->_is_cli = FALSE;
}
$this->_log_file_name = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'runtime.log';
$this->_LoadLog();
$this->_OpenLogFile();
}
public function Severity(){
return $this->_severity;
}
public function SeverityStr(){
return $this->_config->LogSeverityStr( $this->_severity);
}
public function Clean(){
/*
* reset log lines stored in database
*/
$this->_log_cache = array();
$this->_StoreLog();
/*
* reset log file
*/
$this->_ResetLog();
}
public function Info( $msg ){
if( $this->_severity >= CQtrConfig::$LOG_SEVERITY["INFO"] ){
$this->_Trim();
$this->_Log("INFO",$msg);
}
}
public function Warning( $msg ){
if( $this->_severity >= CQtrConfig::$LOG_SEVERITY["WARNING"] ){
$this->_Trim();
$this->_Log("WARNING",$msg);
}
}
public function Error( $msg ){
if( $this->_severity >= CQtrConfig::$LOG_SEVERITY["ERROR"] ){
$this->_Trim();
$this->_Log("ERROR",$msg);
}
}
public function GetFromLine( $line = 0 ){
$size = count( $this->_log_cache );
$index = 0;
for(;$index < $size;$index++){
if( $this->_log_cache[$index][0] >= $line ){
break;
}
}
if( $index < $size ){
$output = array();
for(;$index < $size;$index++){
array_push($output,$this->_log_cache[$index]);
}
return $output;
}else{
return NULL;
}
}
public function GetAllLines(){
return $this->_log_cache;
}
/***************************************************************
* PROTECTED METHODS
**************************************************************/
protected function _Trim(){
if( count( $this->_log_cache ) > $this->_max_lines ){
while( count( $this->_log_cache ) > $this->_max_lines ){
array_shift ( $this->_log_cache );
}
}
}
protected function _Log( $severity, $msg ){
if ( $this->_is_cli ) {
printf("[%s] %s %s\n",date("h:i:s"),$severity,$msg);
$this->_WriteLog($severity, $msg);
return;
}
/*
* Write to log file if log file in use
*/
$this->_WriteLog($severity, $msg);
$this->_LoadLog();
if( count($this->_log_cache ) == 0 ){
/*
* log cache empty, adding first line
*/
array_push( $this->_log_cache, array(0,$severity,$msg));
} else {
$last = end($this->_log_cache);
if( !$last ){
/*
* adding this log line as a first one
*/
array_push( $this->_log_cache, array(0,$severity,$msg));
} else {
/*
* append new log line
*/
$index = $last[0] + 1;
array_push( $this->_log_cache,array($index,$severity,$msg));
}
}
$this->_StoreLog();
}
protected function _StoreLog()
{
$body = CQtrOptions::Serialize( $this->_log_cache );
if ( CQtrOptions::GetOption( QTR_LOGGER ) !== false )
{
$rc = CQtrOptions::UpdateOption( QTR_LOGGER, $body );
}
else
{
$deprecated = null;
$autoload = 'no';
return CQtrOptions::AddOption( QTR_LOGGER, $body ,$deprecated, $autoload );
}
}
protected function _LoadLog()
{
$body = CQtrOptions::GetOption( QTR_LOGGER );
if( $body )
{
$this->_log_cache = CQtrOptions::Unserialize( $body );
if( !is_array( $this->_log_cache ) ){
/*
* something gone wrong, reset log
*/
$this->_log_cache = array();
}
}
else
{
/*
* nothing found
*/
$this->_log_cache = array();
}
$this->_Trim();
return TRUE;
}
protected function _OpenLogFile()
{
/*
* open file and move pointer to the end of file
*/
if(defined("QTR_DEBUG")){
$this->_log_file = fopen( $this->_log_file_name, "a+");
}else{
$this->_log_file = null;
}
return $this->_log_file;
}
protected function _WriteLog( $severity, $msg )
{
if( $this->_log_file )
{
$rc = fwrite( $this->_log_file,
sprintf("[%s] %s\t%s\n",
date("h:i:s"),
$severity,
$msg));
fflush($this->_log_file);
return $rc;
}
return 0;
}
protected function _ResetLog()
{
if( $this->_log_file ){
fclose($this->_log_file);
$this->_log_file = NULL;
}
/*
* open file and erase all its content
*/
@unlink($this->_log_file_name);
$this->_OpenLogFile();
}
}
?>