* Copyright (c) 2025 bitweaver.org, All Rights Reserved * This source file is subject to the 2.0 GNU GENERAL PUBLIC LICENSE. * * BitLogger: Simple logging library for PHP CLI applications * Supports PSR-3 log levels and site instance context */ /** * Class to handle logging with site instance context */ class BitLogger { private $logFile; private $instance; // PSR-3 log levels const EMERGENCY = 'EMERGENCY'; const ALERT = 'ALERT'; const CRITICAL = 'CRITICAL'; const ERROR = 'ERROR'; const WARNING = 'WARNING'; const NOTICE = 'NOTICE'; const INFO = 'INFO'; const DEBUG = 'DEBUG'; /** * Initialize logger with log file path and site instance * @param string $logFile Path to log file * @param string $instance Site instance identifier */ public function __construct(string $logFile, string $instance = 'global') { $this->logFile = $logFile; $this->instance = $instance; // Ensure log file directory exists $dir = dirname($logFile); if (!is_dir($dir)) { mkdir($dir, 0755, true); } } /** * Log a message with the specified level * @param string $level Log level (e.g., INFO, ERROR) * @param string $message Message to log * @param array $context Additional context (optional) */ public function log(string $level, string $message, array $context = []) { $validLevels = [ self::EMERGENCY, self::ALERT, self::CRITICAL, self::ERROR, self::WARNING, self::NOTICE, self::INFO, self::DEBUG, ]; // Validate log level $level = strtoupper($level); if (!in_array($level, $validLevels)) { $this->log(self::ERROR, "Invalid log level: $level"); return; } // Format log message $timestamp = date('Y-m-d H:i:s'); $contextStr = $context ? ' ' . json_encode($context) : ''; $logLine = "[$timestamp] [{$this->instance}] [$level] $message$contextStr\n"; // Write to log file (thread-safe) file_put_contents($this->logFile, $logLine, FILE_APPEND | LOCK_EX); } // Convenience methods for each log level public function emergency(string $message, array $context = []) { $this->log(self::EMERGENCY, $message, $context); } public function alert(string $message, array $context = []) { $this->log(self::ALERT, $message, $context); } public function critical(string $message, array $context = []) { $this->log(self::CRITICAL, $message, $context); exit; } public function error(string $message, array $context = []) { $this->log(self::ERROR, $message, $context); } public function warning(string $message, array $context = []) { $this->log(self::WARNING, $message, $context); } public function notice(string $message, array $context = []) { $this->log(self::NOTICE, $message, $context); } public function info(string $message, array $context = []) { $this->log(self::INFO, $message, $context); } public function debug(string $message, array $context = []) { $this->log(self::DEBUG, $message, $context); } } /* Example usage if (php_sapi_name() === 'cli' && basename(__FILE__) === 'logger.php') { $logger = new BitLogger('logs/app.log', 'test_instance'); $logger->info('Application started'); $logger->warning('Low disk space', ['free_space' => '500MB']); $logger->error('Failed to connect to database', ['error_code' => 1001]); } */