Current Directory: /home/astoriaah/www/old15/plugins/system/shlib/shl_packages/system
Viewing File: /home/astoriaah/www/old15/plugins/system/shlib/shl_packages/system/log.php
<?php
/**
* Shlib - programming library
*
* @author Yannick Gaultier
* @copyright (c) Yannick Gaultier 2013
* @package shlib
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL
* @version 0.2.9.370
* @date 2014-06-11
*/
// no direct access
defined( '_JEXEC' ) or die;
class ShlSystem_Log {
const DEBUG = 128;
const INFO = 64;
const ERROR = 8;
const ALERT = 2;
// log files types, used to select file type for backend display
const TYPE_GENERAL = 1;
const TYPE_ERRORS = 2;
const TYPE_DEBUG = 3;
const TYPE_ALERTS = 4;
const TYPE_PURCHASES = 20;
// levels text message for inclusion in log files
static public $textLevels = array( self::DEBUG => 'debug', self::INFO => 'info', self::ERROR => 'error', self::ALERT => 'alert');
// list of levels that must be logged (empty array will disabled logging)
static protected $_logLevel = array( self::INFO, self::ERROR, self::ALERT, self::DEBUG);
// list of levels that must be notified
static protected $_notifyLevel = array( self::ALERT);
// target email address(es) for notification
static protected $_notifyTarget = '';
/**
* Store configuration, provided by main process
*
* @param array $config
*/
public static function setConfig( $config) {
if(isset( $config['logLevel'])) {
self::$_logLevel = $config['logLevel'];
}
if(isset( $config['notifyLevel'])) {
self::$_notifyLevel = $config['notifyLevel'];
}
if(isset( $config['notifyTarget'])) {
self::$_notifyTarget = $config['notifyTarget'];
}
}
public static function getFullConfig() {
return array( 'logLevel' => self::$_logLevel, 'notifyLevel' => self::$_notifyLevel, 'notifyTarget' => self::$_notifyTarget);
}
/**
* Get current configuration array
*
* @return array $config
*/
public static function getConfig( $type) {
if(empty( $type)) {
return array();
}
$property = '_' . $type;
if(!isset( self::$property)) {
return array();
}
return self::$type;
}
/**
* Write a message to a log system, usually a log file
*
* Deprecated, legacy code, to be removed
*
* @param string $file the target log file/log name
* @param string $message message to be stored
* @param string $status short code string, describing status of operation being loggged, such as OK, ERR, ...
* @param string $level level of logging, only the messages logged with certain levels are actually logged
*/
public static function log( $file, $message, $status = 'OK', $level = 'info') {
switch ($level) {
case 'debug':
$level = self::DEBUG;
break;
case 'info':
$level = self::INFO;
break;
case 'error':
$level = self::ERROR;
break;
case 'alert':
$level = self::ALERT;
break;
}
$status = self::logCustom( $file, $level, array(), $message);
return $status;
}
/**
* Log a message with level Error
*
* @param string message
* @param mixed various params to be sprintfed into the msg
* @return boolean true if success
*/
public static function error( $prefix) {
$args = func_get_args();
$d = array_shift( $args);
return self::_log( 'errors', self::ERROR, array( 'category' => $prefix), $args);
}
/**
* Deprecated, use ShlSystemLog::error( $prefix)
*/
public static function logError() {
$args = func_get_args();
return self::_log( 'errors', self::ERROR, array( 'category' => 'error'), $args);
}
public static function alert( $prefix) {
$args = func_get_args();
$d = array_shift( $args);
return self::_log( 'alerts', self::ALERT, array('category' => $prefix), $args);
}
/**
* Deprecated, use ShlSystemLog::alert( $prefix)
*/
public static function logAlert() {
$args = func_get_args();
return self::_log( 'alerts', self::ALERT, array('category' => 'alert'), $args);
}
public static function debug( $prefix) {
$args = func_get_args();
$d = array_shift( $args);
return self::_log( 'debug', self::DEBUG, array('category' => $prefix), $args);
}
/**
* Deprecated, use ShlSystemLog::debug( $prefix)
*/
public static function logDebug( $prefix) {
$args = func_get_args();
return self::_log( 'debug', self::DEBUG, array('category' => 'debug'), $args);
}
public static function info( $prefix) {
$args = func_get_args();
$d = array_shift( $args);
return self::_log( 'info', self::INFO, array('category' => $prefix), $args);
}
public static function logInfo() {
$args = func_get_args();
return self::_log( 'info', self::INFO, array('category' => 'info'), $args);
}
public static function custom( $prefix, $level, $category) {
$args = func_get_args();
$d = array_shift( $args);
return self::_log( $prefix, $level, array('category' => $category), $args);
}
/**
* Deprecated, use ShlSystemLog::custom( $prefix)
*/
public static function logCustom( $file, $level, $options) {
$args = func_get_args();
$d = array_shift( $args); // remove file
$d = array_shift( $args); // remove level
$d = array_shift( $args); // remove options
return self::_log( $file, $level, $options, $args);
}
public static function _log( $file, $level = self::INFO, $options, $args = null) {
// nothing to do, go away asap
if(!in_array( $level, self::$_logLevel) && !in_array( $level, self::$_notifyLevel)) {
return true;
}
// something to do, process message
if (count($args) > 1) {
// use sprintf
$message = call_user_func_array('sprintf', $args);
} else {
$message = $args[0]; // no variable parts, just use first element as a string
}
// results
$logStatus = true;
$notifyStatus = true;
// include user details in logging
$user = JFactory::getUser();
$userString = empty( $user->id) ? 'guest' : $user->id . ' (' . $user->email . ')';
// do logging
if(in_array( $level, self::$_logLevel)) {
// note: cannot use Exceptions here, as one plugin throwing an exception
// would prevent other plugins to be fired
$params = array( 'file' => $file, 'priority' => $level, 'type' => $level . '-' . self::$textLevels[$level], 'user' => $userString, 'message' => $message);
// merge in additional options set by caller
// include: format and timestamp
if(is_array( $options)) {
$params = array_merge( $params, $options);
}
$logStatus = self::_logToFile($params);
}
// do notifying
if(in_array( $level, self::$_notifyLevel)) {
// check if we're supposed to send notification to the site admin
// @TODO: target emails for notifications should be configurable
// should be able to send to more than one, at least CC or BCC
$app = JFactory::getApplication();
// prepare standard email based on template
$ip = empty($_SERVER['REMOTE_ADDR']) ? 'N/A' : $_SERVER['REMOTE_ADDR'];
//load the language strings
JPlugin::loadLanguage( 'plg_system_shlib', JPATH_ADMINISTRATOR);
$subject = JText::sprintf( 'PLG_SHLIB_ADMIN_ALERT_SUBJECT', $app->getCfg( 'sitename'));
$body = JText::sprintf( 'PLG_SHLIB_ADMIN_ALERT_BODY', $app->getCfg( 'fromname'), $app->getCfg( 'sitename'), $message, $userString, $ip);
$emailParams = array( 'body' => $body, 'subject' => $subject);
// find about recipient(s), if any
if(!empty(self::$_notifyTarget)) {
$emailParams['cc'] = explode( ',', self::$_notifyTarget);
}
// use email helper
$notifyStatus = ShlSystem_email::send( $emailParams, $noLog = true);
}
return $logStatus && $notifyStatus;
}
protected static function _logToFile( $params) {
// check params
$defaultParams = array(
'file' => 'info'
, 'category' => 'shLib'
, 'date' => ShlSystem_Date::getSiteNow( 'Y-m-d')
, 'time' => ShlSystem_Date::getSiteNow( 'H:i:s')
, 'message' => 'No logging message, probably an error'
, 'user' => '-'
, 'priority' => self::INFO
, 'text_entry_format' => "{DATE}\t{TIME}\t{TYPE}\t{C-IP}\t{USER}\t{MESSAGE}"
, 'timestamp' => ShlSystem_Date::getSiteNow( 'Y-m-d')
, 'prefix' => 'shlib');
$liveParams = array_merge( $defaultParams, $params);
$options = array();
$options['text_file'] = $liveParams['category'] . '/' . $liveParams['file'] . '/log_'. $liveParams['file']. '.' . $liveParams['timestamp'] . '.log.php';
$options['text_entry_format'] = $liveParams['text_entry_format'];
jimport( 'joomla.error.log');
JLog::addLogger( $options, $liveParams['priority'], $categories = array($liveParams['category']));
// create an entry for the log file
$entry = new JLogEntry( '');
foreach( $liveParams as $key => $value) {
$entry->$key = $value;
}
// and add it
JLog::add( $entry);
return true;
}
}