blob: b0576c58f189396e857ad477b9b7234dffdbbff6 [file] [log] [blame]
Andrey Andreevc5536aa2012-11-01 17:33:58 +02001<?php
Derek Allard2067d1a2008-11-13 22:59:24 +00002/**
3 * CodeIgniter
4 *
Phil Sturgeon07c1ac82012-03-09 17:03:37 +00005 * An open source application development framework for PHP 5.2.4 or newer
Derek Allard2067d1a2008-11-13 22:59:24 +00006 *
Andrey Andreevbdb96ca2014-10-28 00:13:31 +02007 * This content is released under the MIT License (MIT)
Andrey Andreev76cc9202011-12-22 20:02:04 +02008 *
Andrey Andreevbdb96ca2014-10-28 00:13:31 +02009 * Copyright (c) 2014, British Columbia Institute of Technology
Andrey Andreev76cc9202011-12-22 20:02:04 +020010 *
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020011 * 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:
Derek Jonesf4a4bd82011-10-20 12:18:42 -050017 *
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020018 * 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
darwinel871754a2014-02-11 17:34:57 +010031 * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020032 * @copyright Copyright (c) 2014, British Columbia Institute of Technology (http://bcit.ca/)
33 * @license http://opensource.org/licenses/MIT MIT License
34 * @link http://codeigniter.com
35 * @since Version 1.0.0
Derek Allard2067d1a2008-11-13 22:59:24 +000036 * @filesource
37 */
Andrey Andreevc5536aa2012-11-01 17:33:58 +020038defined('BASEPATH') OR exit('No direct script access allowed');
Derek Allard2067d1a2008-11-13 22:59:24 +000039
Derek Allard2067d1a2008-11-13 22:59:24 +000040/**
41 * Logging Class
42 *
43 * @package CodeIgniter
44 * @subpackage Libraries
45 * @category Logging
Derek Jonesf4a4bd82011-10-20 12:18:42 -050046 * @author EllisLab Dev Team
Derek Allard2067d1a2008-11-13 22:59:24 +000047 * @link http://codeigniter.com/user_guide/general/errors.html
48 */
49class CI_Log {
50
Timothy Warrenb82bc3a2012-04-27 09:12:58 -040051 /**
52 * Path to save log files
53 *
54 * @var string
55 */
Greg Aker2eaa4072010-12-21 11:44:08 -060056 protected $_log_path;
Andrey Andreev56454792012-05-17 14:32:19 +030057
Timothy Warrenb82bc3a2012-04-27 09:12:58 -040058 /**
Andrey Andreev45965742014-08-27 20:40:11 +030059 * File permissions
60 *
61 * @var int
62 */
63 protected $_file_permissions = 0644;
64
65 /**
Timothy Warrenb82bc3a2012-04-27 09:12:58 -040066 * Level of logging
67 *
68 * @var int
69 */
Andrey Andreev45965742014-08-27 20:40:11 +030070 protected $_threshold = 1;
Andrey Andreev56454792012-05-17 14:32:19 +030071
Timothy Warrenb82bc3a2012-04-27 09:12:58 -040072 /**
73 * Highest level of logging
74 *
75 * @var int
76 */
Andrey Andreev45965742014-08-27 20:40:11 +030077 protected $_threshold_max = 0;
Andrey Andreev56454792012-05-17 14:32:19 +030078
Timothy Warrenb82bc3a2012-04-27 09:12:58 -040079 /**
80 * Array of threshold levels to log
81 *
82 * @var array
83 */
Andrey Andreev45965742014-08-27 20:40:11 +030084 protected $_threshold_array = array();
Andrey Andreev56454792012-05-17 14:32:19 +030085
Timothy Warrenb82bc3a2012-04-27 09:12:58 -040086 /**
87 * Format of timestamp for log files
88 *
89 * @var string
90 */
Andrey Andreev45965742014-08-27 20:40:11 +030091 protected $_date_fmt = 'Y-m-d H:i:s';
Andrey Andreev56454792012-05-17 14:32:19 +030092
Timothy Warrenb82bc3a2012-04-27 09:12:58 -040093 /**
Andrey Andreeva107a0f2013-02-15 22:30:31 +020094 * Filename extension
95 *
96 * @var string
97 */
98 protected $_file_ext;
99
100 /**
Timothy Warrenb82bc3a2012-04-27 09:12:58 -0400101 * Whether or not the logger can write to the log files
102 *
103 * @var bool
104 */
Andrey Andreev45965742014-08-27 20:40:11 +0300105 protected $_enabled = TRUE;
Andrey Andreev56454792012-05-17 14:32:19 +0300106
Timothy Warrenb82bc3a2012-04-27 09:12:58 -0400107 /**
108 * Predefined logging levels
109 *
110 * @var array
111 */
Andrey Andreev45965742014-08-27 20:40:11 +0300112 protected $_levels = array('ERROR' => 1, 'DEBUG' => 2, 'INFO' => 3, 'ALL' => 4);
Derek Allard2067d1a2008-11-13 22:59:24 +0000113
Andrey Andreeva107a0f2013-02-15 22:30:31 +0200114 // --------------------------------------------------------------------
115
Timothy Warrenb82bc3a2012-04-27 09:12:58 -0400116 /**
Andrey Andreeva107a0f2013-02-15 22:30:31 +0200117 * Class constructor
Timothy Warrenb82bc3a2012-04-27 09:12:58 -0400118 *
Andrey Andreev56454792012-05-17 14:32:19 +0300119 * @return void
Timothy Warrenb82bc3a2012-04-27 09:12:58 -0400120 */
Greg Akera9263282010-11-10 15:26:43 -0600121 public function __construct()
Derek Allard2067d1a2008-11-13 22:59:24 +0000122 {
123 $config =& get_config();
Barry Mienydd671972010-10-04 16:33:58 +0200124
Alex Bilbied261b1e2012-06-02 11:12:16 +0100125 $this->_log_path = ($config['log_path'] !== '') ? $config['log_path'] : APPPATH.'logs/';
Andrey Andreeva107a0f2013-02-15 22:30:31 +0200126 $this->_file_ext = (isset($config['log_file_extension']) && $config['log_file_extension'] !== '')
127 ? ltrim($config['log_file_extension'], '.') : 'php';
Chris Passas0bd6b282013-02-13 14:16:18 -0500128
Andrey Andreev45965742014-08-27 20:40:11 +0300129 file_exists($this->_log_path) OR mkdir($this->_log_path, 0755, TRUE);
Andrey Andreev9f690f12013-01-21 15:30:25 +0200130
Greg Aker2eaa4072010-12-21 11:44:08 -0600131 if ( ! is_dir($this->_log_path) OR ! is_really_writable($this->_log_path))
Derek Allard2067d1a2008-11-13 22:59:24 +0000132 {
133 $this->_enabled = FALSE;
134 }
Barry Mienydd671972010-10-04 16:33:58 +0200135
Derek Allard2067d1a2008-11-13 22:59:24 +0000136 if (is_numeric($config['log_threshold']))
137 {
Andrey Andreev76cc9202011-12-22 20:02:04 +0200138 $this->_threshold = (int) $config['log_threshold'];
Derek Allard2067d1a2008-11-13 22:59:24 +0000139 }
Nithin333f9f92011-08-21 16:52:06 -0400140 elseif (is_array($config['log_threshold']))
141 {
142 $this->_threshold = $this->_threshold_max;
143 $this->_threshold_array = array_flip($config['log_threshold']);
144 }
Barry Mienydd671972010-10-04 16:33:58 +0200145
Andrey Andreev45965742014-08-27 20:40:11 +0300146 if ( ! empty($config['log_date_format']))
Derek Allard2067d1a2008-11-13 22:59:24 +0000147 {
148 $this->_date_fmt = $config['log_date_format'];
149 }
Andrey Andreev45965742014-08-27 20:40:11 +0300150
Andrey Andreevdc0ad202014-09-17 10:34:04 +0300151 if ( ! empty($config['log_file_permissions']) && is_int($config['log_file_permissions']))
Andrey Andreev45965742014-08-27 20:40:11 +0300152 {
153 $this->_file_permissions = $config['log_file_permissions'];
154 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000155 }
Barry Mienydd671972010-10-04 16:33:58 +0200156
Derek Allard2067d1a2008-11-13 22:59:24 +0000157 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200158
Derek Allard2067d1a2008-11-13 22:59:24 +0000159 /**
160 * Write Log File
161 *
162 * Generally this function will be called using the global log_message() function
163 *
vlakoffd0c30ab2013-05-07 07:49:23 +0200164 * @param string the error level: 'error', 'debug' or 'info'
Derek Allard2067d1a2008-11-13 22:59:24 +0000165 * @param string the error message
Derek Allard2067d1a2008-11-13 22:59:24 +0000166 * @return bool
Barry Mienydd671972010-10-04 16:33:58 +0200167 */
Andrey Andreev838c9a92013-09-13 14:05:13 +0300168 public function write_log($level, $msg)
Barry Mienydd671972010-10-04 16:33:58 +0200169 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000170 if ($this->_enabled === FALSE)
171 {
172 return FALSE;
173 }
Barry Mienydd671972010-10-04 16:33:58 +0200174
Derek Allard2067d1a2008-11-13 22:59:24 +0000175 $level = strtoupper($level);
Barry Mienydd671972010-10-04 16:33:58 +0200176
Andrey Andreev76cc9202011-12-22 20:02:04 +0200177 if (( ! isset($this->_levels[$level]) OR ($this->_levels[$level] > $this->_threshold))
Andrey Andreev443bbd92012-04-03 15:49:11 +0300178 && ! isset($this->_threshold_array[$this->_levels[$level]]))
Derek Allard2067d1a2008-11-13 22:59:24 +0000179 {
Andrey Andreev76cc9202011-12-22 20:02:04 +0200180 return FALSE;
Derek Allard2067d1a2008-11-13 22:59:24 +0000181 }
Barry Mienydd671972010-10-04 16:33:58 +0200182
Andrey Andreeva107a0f2013-02-15 22:30:31 +0200183 $filepath = $this->_log_path.'log-'.date('Y-m-d').'.'.$this->_file_ext;
184 $message = '';
Barry Mienydd671972010-10-04 16:33:58 +0200185
Derek Allard2067d1a2008-11-13 22:59:24 +0000186 if ( ! file_exists($filepath))
187 {
Jeroen van der Gulik2835e082011-12-04 14:19:38 +0100188 $newfile = TRUE;
Andrey Andreeva107a0f2013-02-15 22:30:31 +0200189 // Only add protection to php files
190 if ($this->_file_ext === 'php')
Chris Passasfb8de242013-02-14 09:01:24 -0500191 {
Andrey Andreeva107a0f2013-02-15 22:30:31 +0200192 $message .= "<?php defined('BASEPATH') OR exit('No direct script access allowed'); ?>\n\n";
Chris Passasfb8de242013-02-14 09:01:24 -0500193 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000194 }
Barry Mienydd671972010-10-04 16:33:58 +0200195
Andrey Andreev7cf682a2014-03-13 14:55:45 +0200196 if ( ! $fp = @fopen($filepath, 'ab'))
Derek Allard2067d1a2008-11-13 22:59:24 +0000197 {
198 return FALSE;
199 }
200
Andrey Andreev3d215202014-01-15 11:08:47 +0200201 $message .= $level.' - '.date($this->_date_fmt).' --> '.$msg."\n";
Barry Mienydd671972010-10-04 16:33:58 +0200202
203 flock($fp, LOCK_EX);
Andrey Andreevd8b1ad32014-01-15 17:42:52 +0200204
205 for ($written = 0, $length = strlen($message); $written < $length; $written += $result)
206 {
207 if (($result = fwrite($fp, substr($message, $written))) === FALSE)
208 {
209 break;
210 }
211 }
212
Derek Allard2067d1a2008-11-13 22:59:24 +0000213 flock($fp, LOCK_UN);
214 fclose($fp);
Barry Mienydd671972010-10-04 16:33:58 +0200215
Andrey Andreev443bbd92012-04-03 15:49:11 +0300216 if (isset($newfile) && $newfile === TRUE)
Jeroen van der Gulik2835e082011-12-04 14:19:38 +0100217 {
Andrey Andreev45965742014-08-27 20:40:11 +0300218 chmod($filepath, $this->_file_permissions);
Jeroen van der Gulik2835e082011-12-04 14:19:38 +0100219 }
Andrey Andreev443bbd92012-04-03 15:49:11 +0300220
Andrey Andreevd8b1ad32014-01-15 17:42:52 +0200221 return is_int($result);
Derek Allard2067d1a2008-11-13 22:59:24 +0000222 }
223
224}
Derek Allard2067d1a2008-11-13 22:59:24 +0000225
226/* End of file Log.php */
Andrey Andreev13c818e2013-09-14 21:44:36 +0300227/* Location: ./system/core/Log.php */