|
1 <?php |
|
2 /** |
|
3 * $Id: Logger.class.php 10 2007-05-27 10:55:12Z spocke $ |
|
4 * |
|
5 * @package MCFileManager.filesystems |
|
6 * @author Moxiecode |
|
7 * @copyright Copyright © 2005, Moxiecode Systems AB, All rights reserved. |
|
8 */ |
|
9 |
|
10 // File type contstants |
|
11 define('MC_LOGGER_DEBUG', 0); |
|
12 define('MC_LOGGER_INFO', 10); |
|
13 define('MC_LOGGER_WARN', 20); |
|
14 define('MC_LOGGER_ERROR', 30); |
|
15 define('MC_LOGGER_FATAL', 40); |
|
16 |
|
17 /** |
|
18 * Logging utility class. This class handles basic logging with levels, log rotation and custom log formats. It's |
|
19 * designed to be compact but still powerful and flexible. |
|
20 */ |
|
21 class Moxiecode_Logger { |
|
22 // Private fields |
|
23 var $_path; |
|
24 var $_filename; |
|
25 var $_maxSize; |
|
26 var $_maxFiles; |
|
27 var $_maxSizeBytes; |
|
28 var $_level; |
|
29 var $_format; |
|
30 |
|
31 /** |
|
32 * Constructs a new logger instance. |
|
33 */ |
|
34 function Moxiecode_Logger() { |
|
35 $this->_path = ""; |
|
36 $this->_filename = "{level}.log"; |
|
37 $this->setMaxSize("100k"); |
|
38 $this->_maxFiles = 10; |
|
39 $this->_level = MC_LOGGER_DEBUG; |
|
40 $this->_format = "[{time}] [{level}] {message}"; |
|
41 } |
|
42 |
|
43 /** |
|
44 * Sets the current log level, use the MC_LOGGER constants. |
|
45 * |
|
46 * @param int $level Log level instance for example MC_LOGGER_DEBUG. |
|
47 */ |
|
48 function setLevel($level) { |
|
49 if (is_string($level)) { |
|
50 switch (strtolower($level)) { |
|
51 case "debug": |
|
52 $level = MC_LOGGER_DEBUG; |
|
53 break; |
|
54 |
|
55 case "info": |
|
56 $level = MC_LOGGER_INFO; |
|
57 break; |
|
58 |
|
59 case "warn": |
|
60 case "warning": |
|
61 $level = MC_LOGGER_WARN; |
|
62 break; |
|
63 |
|
64 case "error": |
|
65 $level = MC_LOGGER_ERROR; |
|
66 break; |
|
67 |
|
68 case "fatal": |
|
69 $level = MC_LOGGER_FATAL; |
|
70 break; |
|
71 |
|
72 default: |
|
73 $level = MC_LOGGER_FATAL; |
|
74 } |
|
75 } |
|
76 |
|
77 $this->_level = $level; |
|
78 } |
|
79 |
|
80 /** |
|
81 * Returns the current log level for example MC_LOGGER_DEBUG. |
|
82 * |
|
83 * @return int Current log level for example MC_LOGGER_DEBUG. |
|
84 */ |
|
85 function getLevel() { |
|
86 return $this->_level; |
|
87 } |
|
88 |
|
89 function setPath($path) { |
|
90 $this->_path = $path; |
|
91 } |
|
92 |
|
93 function getPath() { |
|
94 return $this->_path; |
|
95 } |
|
96 |
|
97 function setFileName($file_name) { |
|
98 $this->_filename = $file_name; |
|
99 } |
|
100 |
|
101 function getFileName() { |
|
102 return $this->_filename; |
|
103 } |
|
104 |
|
105 function setFormat($format) { |
|
106 $this->_format = $format; |
|
107 } |
|
108 |
|
109 function getFormat() { |
|
110 return $this->_format; |
|
111 } |
|
112 |
|
113 function setMaxSize($size) { |
|
114 // Fix log max size |
|
115 $logMaxSizeBytes = intval(preg_replace("/[^0-9]/", "", $size)); |
|
116 |
|
117 // Is KB |
|
118 if (strpos((strtolower($size)), "k") > 0) |
|
119 $logMaxSizeBytes *= 1024; |
|
120 |
|
121 // Is MB |
|
122 if (strpos((strtolower($size)), "m") > 0) |
|
123 $logMaxSizeBytes *= (1024 * 1024); |
|
124 |
|
125 $this->_maxSizeBytes = $logMaxSizeBytes; |
|
126 $this->_maxSize = $size; |
|
127 } |
|
128 |
|
129 function getMaxSize() { |
|
130 return $this->_maxSize; |
|
131 } |
|
132 |
|
133 function setMaxFiles($max_files) { |
|
134 $this->_maxFiles = $max_files; |
|
135 } |
|
136 |
|
137 function getMaxFiles() { |
|
138 return $this->_maxFiles; |
|
139 } |
|
140 |
|
141 function debug($msg) { |
|
142 $args = func_get_args(); |
|
143 $this->_logMsg(MC_LOGGER_DEBUG, implode(', ', $args)); |
|
144 } |
|
145 |
|
146 function info($msg) { |
|
147 $args = func_get_args(); |
|
148 $this->_logMsg(MC_LOGGER_INFO, implode(', ', $args)); |
|
149 } |
|
150 |
|
151 function warn($msg) { |
|
152 $args = func_get_args(); |
|
153 $this->_logMsg(MC_LOGGER_WARN, implode(', ', $args)); |
|
154 } |
|
155 |
|
156 function error($msg) { |
|
157 $args = func_get_args(); |
|
158 $this->_logMsg(MC_LOGGER_ERROR, implode(', ', $args)); |
|
159 } |
|
160 |
|
161 function fatal($msg) { |
|
162 $args = func_get_args(); |
|
163 $this->_logMsg(MC_LOGGER_FATAL, implode(', ', $args)); |
|
164 } |
|
165 |
|
166 function isDebugEnabled() { |
|
167 return $this->_level >= MC_LOGGER_DEBUG; |
|
168 } |
|
169 |
|
170 function isInfoEnabled() { |
|
171 return $this->_level >= MC_LOGGER_INFO; |
|
172 } |
|
173 |
|
174 function isWarnEnabled() { |
|
175 return $this->_level >= MC_LOGGER_WARN; |
|
176 } |
|
177 |
|
178 function isErrorEnabled() { |
|
179 return $this->_level >= MC_LOGGER_ERROR; |
|
180 } |
|
181 |
|
182 function isFatalEnabled() { |
|
183 return $this->_level >= MC_LOGGER_FATAL; |
|
184 } |
|
185 |
|
186 function _logMsg($level, $message) { |
|
187 $roll = false; |
|
188 |
|
189 if ($level < $this->_level) |
|
190 return; |
|
191 |
|
192 $logFile = $this->toOSPath($this->_path . "/" . $this->_filename); |
|
193 |
|
194 switch ($level) { |
|
195 case MC_LOGGER_DEBUG: |
|
196 $levelName = "DEBUG"; |
|
197 break; |
|
198 |
|
199 case MC_LOGGER_INFO: |
|
200 $levelName = "INFO"; |
|
201 break; |
|
202 |
|
203 case MC_LOGGER_WARN: |
|
204 $levelName = "WARN"; |
|
205 break; |
|
206 |
|
207 case MC_LOGGER_ERROR: |
|
208 $levelName = "ERROR"; |
|
209 break; |
|
210 |
|
211 case MC_LOGGER_FATAL: |
|
212 $levelName = "FATAL"; |
|
213 break; |
|
214 } |
|
215 |
|
216 $logFile = str_replace('{level}', strtolower($levelName), $logFile); |
|
217 |
|
218 $text = $this->_format; |
|
219 $text = str_replace('{time}', date("Y-m-d H:i:s"), $text); |
|
220 $text = str_replace('{level}', strtolower($levelName), $text); |
|
221 $text = str_replace('{message}', $message, $text); |
|
222 $message = $text . "\r\n"; |
|
223 |
|
224 // Check filesize |
|
225 if (file_exists($logFile)) { |
|
226 $size = @filesize($logFile); |
|
227 |
|
228 if ($size + strlen($message) > $this->_maxSizeBytes) |
|
229 $roll = true; |
|
230 } |
|
231 |
|
232 // Roll if the size is right |
|
233 if ($roll) { |
|
234 for ($i=$this->_maxFiles-1; $i>=1; $i--) { |
|
235 $rfile = $this->toOSPath($logFile . "." . $i); |
|
236 $nfile = $this->toOSPath($logFile . "." . ($i+1)); |
|
237 |
|
238 if (@file_exists($rfile)) |
|
239 @rename($rfile, $nfile); |
|
240 } |
|
241 |
|
242 @rename($logFile, $this->toOSPath($logFile . ".1")); |
|
243 |
|
244 // Delete last logfile |
|
245 $delfile = $this->toOSPath($logFile . "." . ($this->_maxFiles + 1)); |
|
246 if (@file_exists($delfile)) |
|
247 @unlink($delfile); |
|
248 } |
|
249 |
|
250 // Append log line |
|
251 if (($fp = @fopen($logFile, "a")) != null) { |
|
252 @fputs($fp, $message); |
|
253 @fflush($fp); |
|
254 @fclose($fp); |
|
255 } |
|
256 } |
|
257 |
|
258 /** |
|
259 * Converts a Unix path to OS specific path. |
|
260 * |
|
261 * @param String $path Unix path to convert. |
|
262 */ |
|
263 function toOSPath($path) { |
|
264 return str_replace("/", DIRECTORY_SEPARATOR, $path); |
|
265 } |
|
266 } |
|
267 |
|
268 ?> |