Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
16.67% covered (danger)
16.67%
3 / 18
0.00% covered (danger)
0.00%
0 / 8
CRAP
0.00% covered (danger)
0.00%
0 / 2
KLoggerFactory
25.00% covered (danger)
25.00%
3 / 12
0.00% covered (danger)
0.00%
0 / 2
15.55
0.00% covered (danger)
0.00%
0 / 1
 getLogger
27.27% covered (danger)
27.27%
3 / 11
0.00% covered (danger)
0.00%
0 / 1
10.15
 closeAll
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
NullKLogger
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 6
42
0.00% covered (danger)
0.00%
0 / 1
 LogInfo
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 LogDebug
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 LogWarn
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 LogError
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 LogFatal
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 Log
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3/**
4 * KLogger Factory - Manages KLogger instances to prevent too many open files
5 */
6class KLoggerFactory {
7    private static $instances = [];
8    private static $maxInstances = 20; // Limit number of logger instances
9    
10    /**
11     * Get a logger instance (singleton per file)
12     * 
13     * @param string $logFile The log file path
14     * @param int $priority The log priority level
15     * @return KLogger
16     */
17    public static function getLogger($logFile, $priority = KLogger::DEBUG) {
18        // Normalize the log file path
19        $logFile = realpath(dirname($logFile)) . '/' . basename($logFile);
20        
21        // Check if we already have this logger
22        if (isset(self::$instances[$logFile])) {
23            return self::$instances[$logFile];
24        }
25        
26        // If we've hit the limit, close the oldest logger
27        if (count(self::$instances) >= self::$maxInstances) {
28            $oldestFile = array_key_first(self::$instances);
29            unset(self::$instances[$oldestFile]);
30            // The destructor will close the file handle
31        }
32        
33        // Create new logger instance
34        try {
35            self::$instances[$logFile] = new KLogger($logFile, $priority);
36            return self::$instances[$logFile];
37        } catch (Exception $e) {
38            error_log("KLoggerFactory: Failed to create logger for $logFile - " . $e->getMessage());
39            // Return a null logger that won't write to files
40            return new NullKLogger();
41        }
42    }
43    
44    /**
45     * Close all logger instances
46     */
47    public static function closeAll() {
48        self::$instances = [];
49    }
50}
51
52/**
53 * Null logger for when file creation fails
54 */
55class NullKLogger {
56    public function LogInfo($line) {}
57    public function LogDebug($line) {}
58    public function LogWarn($line) {}
59    public function LogError($line) {}
60    public function LogFatal($line) {}
61    public function Log($line, $priority) {}
62}