Files
2024-07-15 11:28:08 +02:00

188 lines
4.4 KiB
PHP

<?php
/**
* @package solo
* @copyright Copyright (c)2014-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 3 or later
*/
// Protection against direct access
defined('AKEEBAENGINE') or die();
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
/**
* Writes messages to the backup log file
* I couldn't extend the extisting one since there were a lot of "self" calls instead of "static",
* and inheritance wouldn't work.
*/
class AliceUtilLogger
{
public static $logName = null;
static function ResetLog($tag) {
$oldLogName = AliceUtilLogger::$logName;
AliceUtilLogger::$logName = AliceUtilLogger::logName($tag);
$defaultLog = self::logName(null);
// Close the file if it's open
if($oldLogName == AliceUtilLogger::$logName)
{
self::WriteLog(null);
}
// Remove any old log file
@unlink(AliceUtilLogger::$logName);
if(!empty($tag))
{
// Rename the default log (if it exists) to the new name
@rename($defaultLog, AliceUtilLogger::$logName);
}
// Touch the log file
$fp = @fopen(AliceUtilLogger::$logName,'w');
if($fp !== false)
{
@fclose($fp);
}
// Delete the default log
if(!empty($tag)) @unlink($defaultLog);
@chmod(AliceUtilLogger::$logName, 0666);
self::WriteLog(true,'');
}
static function WriteLog( $level, $message = '' )
{
static $oldLog = null;
static $configuredLoglevel;
static $site_root_untranslated;
static $site_root;
static $fp = null;
// Make sure we have a log name
if(empty(self::$logName))
{
self::$logName = self::logName();
}
// Check for log name changes
if(is_null($oldLog)) {
$oldLog = self::$logName;
} elseif($oldLog != self::$logName) {
// The log file changed. Close the old log.
if(is_resource($fp)) @fclose($fp);
$fp = null;
}
// Close the log file if the level is set to NULL
if( is_null($level) && !is_null($fp) )
{
@fclose($fp);
$fp = null;
return;
}
if(empty($site_root) || empty($site_root_untranslated))
{
$site_root_untranslated = Platform::getInstance()->get_site_root();
$site_root = Factory::getFilesystemTools()->TranslateWinPath( $site_root_untranslated );
}
if(empty($configuredLoglevel) or ($level === true))
{
// Load the registry and fetch log level
$registry = Factory::getConfiguration();
$configuredLoglevel = $registry->get('akeeba.basic.log_level');
$configuredLoglevel = $configuredLoglevel * 1;
return;
}
if($level === false)
{
// Pause logging
$configuredLogLevel = false;
return;
}
// Catch paused logging
if($configuredLoglevel === false) return;
if( ($configuredLoglevel >= $level) && ($configuredLoglevel != 0))
{
if(!defined('AKEEBADEBUG')) {
$message = str_replace( $site_root_untranslated, "<root>", $message );
$message = str_replace( $site_root, "<root>", $message );
}
$message = str_replace( "\n", ' \n ', $message );
switch( $level )
{
case _AE_LOG_ERROR:
$string = "ERROR |";
break;
case _AE_LOG_WARNING:
$string = "WARNING |";
break;
case _AE_LOG_INFO:
$string = "INFO |";
break;
default:
$string = "DEBUG |";
break;
}
$string .= @strftime( "%y%m%d %H:%M:%S" ) . "|$message\r\n";
if(is_null($fp))
{
$fp = @fopen( AliceUtilLogger::$logName, "a" );
}
if (!($fp === FALSE))
{
$result = @fwrite( $fp, $string );
if($result === false) {
// Try harder with the file pointer, will ya?
$fp = @fopen( AliceUtilLogger::$logName, "a" );
$result = @fwrite( $fp, $string );
}
}
}
}
/**
* Calculates the absolute path to the log file. Instead of using the path coming from
* Akeeba Backup config, we will always use the Tmp dir
*
* @param string $tag The backup run's tag
*
* @return string The absolute path to the log file
*/
public static function logName( $tag = null)
{
if(empty($tag)) {
$fileName = 'akeeba.log';
} else {
$fileName = "akeeba.$tag.log";
}
// Get log's file name
return Factory::getFilesystemTools()->TranslateWinPath(APATH_ROOT.'/tmp'.DIRECTORY_SEPARATOR.$fileName);
}
public static function closeLog()
{
self::WriteLog(null,null);
}
public static function openLog($tag = null)
{
self::$logName = self::logName($tag);
@touch(self::$logName);
}
}
// Make sure we close the log file every time we finish with a page load
register_shutdown_function( array('AliceUtilLogger','closeLog') );