Subversion-Projekte lars-tiefland.ci

Revision

Revision 1257 | Zur aktuellen Revision | Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
68 lars 1
<?php
2
/**
3
 * CodeIgniter
4
 *
5
 * An open source application development framework for PHP
6
 *
7
 * This content is released under the MIT License (MIT)
8
 *
9
 * Copyright (c) 2014 - 2016, British Columbia Institute of Technology
10
 *
11
 * Permission is hereby granted, free of charge, to any person obtaining a copy
12
 * of this software and associated documentation files (the "Software"), to deal
13
 * in the Software without restriction, including without limitation the rights
14
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15
 * copies of the Software, and to permit persons to whom the Software is
16
 * furnished to do so, subject to the following conditions:
17
 *
18
 * The above copyright notice and this permission notice shall be included in
19
 * all copies or substantial portions of the Software.
20
 *
21
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27
 * THE SOFTWARE.
28
 *
29
 * @package	CodeIgniter
30
 * @author	EllisLab Dev Team
31
 * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
32
 * @copyright	Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/)
33
 * @license	http://opensource.org/licenses/MIT	MIT License
34
 * @link	https://codeigniter.com
35
 * @since	Version 1.0.0
36
 * @filesource
37
 */
38
defined('BASEPATH') OR exit('No direct script access allowed');
39
 
40
/**
41
 * Logging Class
42
 *
43
 * @package		CodeIgniter
44
 * @subpackage	Libraries
45
 * @category	Logging
46
 * @author		EllisLab Dev Team
47
 * @link		https://codeigniter.com/user_guide/general/errors.html
48
 */
49
class CI_Log {
50
 
51
	/**
52
	 * Path to save log files
53
	 *
54
	 * @var string
55
	 */
56
	protected $_log_path;
57
 
58
	/**
59
	 * File permissions
60
	 *
61
	 * @var	int
62
	 */
63
	protected $_file_permissions = 0644;
64
 
65
	/**
66
	 * Level of logging
67
	 *
68
	 * @var int
69
	 */
70
	protected $_threshold = 1;
71
 
72
	/**
73
	 * Array of threshold levels to log
74
	 *
75
	 * @var array
76
	 */
77
	protected $_threshold_array = array();
78
 
79
	/**
80
	 * Format of timestamp for log files
81
	 *
82
	 * @var string
83
	 */
84
	protected $_date_fmt = 'Y-m-d H:i:s';
85
 
86
	/**
87
	 * Filename extension
88
	 *
89
	 * @var	string
90
	 */
91
	protected $_file_ext;
92
 
93
	/**
94
	 * Whether or not the logger can write to the log files
95
	 *
96
	 * @var bool
97
	 */
98
	protected $_enabled = TRUE;
99
 
100
	/**
101
	 * Predefined logging levels
102
	 *
103
	 * @var array
104
	 */
105
	protected $_levels = array('ERROR' => 1, 'DEBUG' => 2, 'INFO' => 3, 'ALL' => 4);
106
 
107
	// --------------------------------------------------------------------
108
 
109
	/**
110
	 * Class constructor
111
	 *
112
	 * @return	void
113
	 */
114
	public function __construct()
115
	{
116
		$config =& get_config();
117
 
118
		$this->_log_path = ($config['log_path'] !== '') ? $config['log_path'] : APPPATH.'logs/';
119
		$this->_file_ext = (isset($config['log_file_extension']) && $config['log_file_extension'] !== '')
120
			? ltrim($config['log_file_extension'], '.') : 'php';
121
 
122
		file_exists($this->_log_path) OR mkdir($this->_log_path, 0755, TRUE);
123
 
124
		if ( ! is_dir($this->_log_path) OR ! is_really_writable($this->_log_path))
125
		{
126
			$this->_enabled = FALSE;
127
		}
128
 
129
		if (is_numeric($config['log_threshold']))
130
		{
131
			$this->_threshold = (int) $config['log_threshold'];
132
		}
133
		elseif (is_array($config['log_threshold']))
134
		{
135
			$this->_threshold = 0;
136
			$this->_threshold_array = array_flip($config['log_threshold']);
137
		}
138
 
139
		if ( ! empty($config['log_date_format']))
140
		{
141
			$this->_date_fmt = $config['log_date_format'];
142
		}
143
 
144
		if ( ! empty($config['log_file_permissions']) && is_int($config['log_file_permissions']))
145
		{
146
			$this->_file_permissions = $config['log_file_permissions'];
147
		}
148
	}
149
 
150
	// --------------------------------------------------------------------
151
 
152
	/**
153
	 * Write Log File
154
	 *
155
	 * Generally this function will be called using the global log_message() function
156
	 *
157
	 * @param	string	$level 	The error level: 'error', 'debug' or 'info'
158
	 * @param	string	$msg 	The error message
159
	 * @return	bool
160
	 */
161
	public function write_log($level, $msg)
162
	{
163
		if ($this->_enabled === FALSE)
164
		{
165
			return FALSE;
166
		}
167
 
168
		$level = strtoupper($level);
169
 
170
		if (( ! isset($this->_levels[$level]) OR ($this->_levels[$level] > $this->_threshold))
171
			&& ! isset($this->_threshold_array[$this->_levels[$level]]))
172
		{
173
			return FALSE;
174
		}
175
 
176
		$filepath = $this->_log_path.'log-'.date('Y-m-d').'.'.$this->_file_ext;
177
		$message = '';
178
 
179
		if ( ! file_exists($filepath))
180
		{
181
			$newfile = TRUE;
182
			// Only add protection to php files
183
			if ($this->_file_ext === 'php')
184
			{
185
				$message .= "<?php defined('BASEPATH') OR exit('No direct script access allowed'); ?>\n\n";
186
			}
187
		}
188
 
189
		if ( ! $fp = @fopen($filepath, 'ab'))
190
		{
191
			return FALSE;
192
		}
193
 
194
		flock($fp, LOCK_EX);
195
 
196
		// Instantiating DateTime with microseconds appended to initial date is needed for proper support of this format
197
		if (strpos($this->_date_fmt, 'u') !== FALSE)
198
		{
199
			$microtime_full = microtime(TRUE);
200
			$microtime_short = sprintf("%06d", ($microtime_full - floor($microtime_full)) * 1000000);
201
			$date = new DateTime(date('Y-m-d H:i:s.'.$microtime_short, $microtime_full));
202
			$date = $date->format($this->_date_fmt);
203
		}
204
		else
205
		{
206
			$date = date($this->_date_fmt);
207
		}
208
 
209
		$message .= $this->_format_line($level, $date, $msg);
210
 
211
		for ($written = 0, $length = strlen($message); $written < $length; $written += $result)
212
		{
213
			if (($result = fwrite($fp, substr($message, $written))) === FALSE)
214
			{
215
				break;
216
			}
217
		}
218
 
219
		flock($fp, LOCK_UN);
220
		fclose($fp);
221
 
222
		if (isset($newfile) && $newfile === TRUE)
223
		{
224
			chmod($filepath, $this->_file_permissions);
225
		}
226
 
227
		return is_int($result);
228
	}
229
 
230
	// --------------------------------------------------------------------
231
 
232
	/**
233
	 * Format the log line.
234
	 *
235
	 * This is for extensibility of log formatting
236
	 * If you want to change the log format, extend the CI_Log class and override this method
237
	 *
238
	 * @param	string	$level 	The error level
239
	 * @param	string	$date 	Formatted date string
240
	 * @param	string	$message 	The log message
241
	 * @return	string	Formatted log line with a new line character '\n' at the end
242
	 */
243
	protected function _format_line($level, $date, $message)
244
	{
245
		return $level.' - '.$date.' --> '.$message."\n";
246
	}
247
}