1 <?php
2
3 use Psr\Log\AbstractLogger;
4 use Psr\Log\LogLevel;
5
6 7 8 9 10 11 12
13 class rex_logger extends AbstractLogger
14 {
15 use rex_factory_trait;
16
17 18 19
20 private static $file;
21
22 23 24 25 26
27 public static function getPath()
28 {
29 return rex_path::coreData('system.log');
30 }
31
32 33 34 35 36
37 public static function logException($exception)
38 {
39 if ($exception instanceof ErrorException) {
40 self::logError($exception->getSeverity(), $exception->getMessage(), $exception->getFile(), $exception->getLine());
41 } else {
42 $logger = self::factory();
43 $logger->log(get_class($exception), $exception->getMessage(), [], $exception->getFile(), $exception->getLine());
44 }
45 }
46
47 48 49 50 51 52 53 54 55 56
57 public static function logError($errno, $errstr, $errfile, $errline)
58 {
59 if (!is_int($errno)) {
60 throw new InvalidArgumentException('Expecting $errno to be integer, but ' . gettype($errno) . ' given!');
61 }
62 if (!is_string($errstr)) {
63 throw new InvalidArgumentException('Expecting $errstr to be string, but ' . gettype($errstr) . ' given!');
64 }
65 if (!is_string($errfile)) {
66 throw new InvalidArgumentException('Expecting $errfile to be string, but ' . gettype($errfile) . ' given!');
67 }
68 if (!is_int($errline)) {
69 throw new InvalidArgumentException('Expecting $errline to be integer, but ' . gettype($errline) . ' given!');
70 }
71
72 $logger = self::factory();
73 $logger->log(rex_error_handler::getErrorType($errno), $errstr, [], $errfile, $errline);
74 }
75
76 77 78 79 80 81 82 83 84 85 86
87 public function log($level, $message, array $context = [], $file = null, $line = null)
88 {
89 if (static::hasFactoryClass()) {
90 static::callFactoryClass(__FUNCTION__, func_get_args());
91 return;
92 }
93
94 if (!is_string($message)) {
95 throw new InvalidArgumentException('Expecting $message to be string, but ' . gettype($message) . ' given!');
96 }
97
98 self::open();
99
100 $replace = [];
101 foreach ($context as $key => $val) {
102 $replace['{' . $key . '}'] = $val;
103 }
104
105
106 $message = strtr($message, $replace);
107
108 $logData = [$level, $message];
109 if ($file && $line) {
110 $logData[] = rex_path::relative($file);
111 $logData[] = $line;
112 }
113 self::$file->add($logData);
114
115
116 error_log($message, 0);
117 }
118
119 120 121
122 public static function open()
123 {
124
125 if (!self::$file) {
126 self::$file = new rex_log_file(self::getPath(), 2000000);
127 }
128 }
129
130 131 132 133 134
135 public static function close()
136 {
137 self::$file = null;
138 }
139
140 141 142 143 144 145 146
147 public static function getLogLevel($errno)
148 {
149 switch ($errno) {
150 case E_STRICT:
151
152 case E_USER_DEPRECATED:
153 case E_DEPRECATED:
154
155 case E_USER_WARNING:
156 case E_WARNING:
157 case E_COMPILE_WARNING:
158 return LogLevel::WARNING;
159
160 case E_USER_NOTICE:
161 case E_NOTICE:
162 return LogLevel::NOTICE;
163
164 default:
165 return LogLevel::ERROR;
166 }
167 }
168
169 170 171
172 public static function factory()
173 {
174 $class = self::getFactoryClass();
175 return new $class();
176 }
177 }
178