log_file = ''; return; } $log_dir = trailingslashit($upload_dir['basedir']) . 'qixit-logs'; // Create log directory if it doesn't exist if (!file_exists($log_dir)) { wp_mkdir_p($log_dir); // Add index.php to prevent directory listing // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_file_put_contents @file_put_contents($log_dir . '/index.php', 'log_file = $log_dir . '/qixit-' . gmdate('Y-m-d') . '.log'; } /** * Log a message * * @param string $message Message to log * @param string $level Log level (info, warning, error) */ public function log($message, $level = 'info') { // Cache the option in a static so we only hit the DB once per request // instead of once per log statement (which can be dozens of times). static $logging_enabled = null; if ($logging_enabled === null) { $logging_enabled = (bool) get_option('qixit_enable_logging', false); } if (!$logging_enabled) { return; } $timestamp = gmdate('Y-m-d H:i:s'); $level = strtoupper($level); $log_entry = "[{$timestamp}] [{$level}] {$message}\n"; // Mirror errors into the plugin debug channel without using PHP error_log(). if ($level === 'ERROR') { if (function_exists('qixit_debug_log')) { qixit_debug_log('Qixit: ' . $message); } } // Write to file if (empty($this->log_file)) { return; } // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_file_put_contents @file_put_contents($this->log_file, $log_entry, FILE_APPEND); } /** * Get log file path * * @return string Log file path */ public function get_log_file() { return $this->log_file; } /** * Get recent log entries * * @param int $lines Number of lines to retrieve * @return array Log entries */ public function get_recent_logs($lines = 100) { if (!file_exists($this->log_file)) { return array(); } $file = file($this->log_file); return array_slice($file, -$lines); } /** * Clear log file */ public function clear_log() { if (file_exists($this->log_file)) { wp_delete_file($this->log_file); } } /** * Log an info message * * @param string $message Message to log */ public function info($message) { $this->log($message, 'info'); } /** * Log a warning message * * @param string $message Message to log */ public function warning($message) { $this->log($message, 'warning'); } /** * Log an error message * * @param string $message Message to log */ public function error($message) { $this->log($message, 'error'); } /** * Log a debug message * * @param string $message Message to log */ public function debug($message) { $this->log($message, 'debug'); } } // Initialize singleton Qixit_Logger::get_instance();