Completed
Pull Request — 3.6 (#7850)
by Jono
07:19
created

Moxiecode_Logger::Moxiecode_Logger()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 7
nc 1
nop 0
dl 0
loc 8
rs 9.4285
c 0
b 0
f 0
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
?>
269