Project

General

Profile

1
<?php
2
/**
3
 *
4
 * @category        event logging
5
 * @package         core
6
 * @author          Independend-Software-Team
7
 * @author          WebsiteBaker Project
8
 * @copyright       2009-2011, Website Baker Org. e.V.
9
 * @link			http://www.websitebaker2.org/
10
 * @license         http://www.gnu.org/licenses/gpl.html
11
 * @platform        WebsiteBaker 2.8.2
12
 * @requirements    PHP 5.2.2 and higher
13
 * @version         $Id: class.logfile.php 1533 2011-12-08 00:05:20Z Luisehahne $
14
 * @filesource		$HeadURL: svn://isteam.dynxs.de/wb-archiv/branches/2.8.x/wb/framework/class.logfile.php $
15
 * @lastmodified    $Date: 2011-12-08 01:05:20 +0100 (Thu, 08 Dec 2011) $
16
 * @description     definition of all core constants.
17
 */
18

    
19
/**
20
 * Description of classlog
21
 *
22
 * @author wkl
23
 */
24
class LogFile {
25

    
26
	private $_fh;                  // file-handle for logfile
27
	private $_log_path;            // path to logfile
28
	private $_log_file;            // name of logfile
29
	private $_error = false;       // store internal errors
30
/*
31
 * class can not be instanciated standalone
32
 */
33
	protected function __construct( $log_file )
34
	{
35
		$this->_log_file = $log_file;
36
	}
37

    
38
/*
39
 * open the logfile for append
40
 */
41
	private function openLogFile()
42
	{
43
		$this->_fh = fopen($this->_log_path.$this->_log_file, 'ab');
44
		return isset($this->_fh);
45
	}
46
/*
47
 * provide read-only properties
48
 */
49
	public function __get($property)
50
	{
51
		switch(strtolower($property)):
52
			case 'error':
53
				return $this->_error;
54
				break;
55
			default:
56
				return null;
57
		endswitch;
58
	}
59
/*
60
 * flush and close logfile
61
 */
62
	private function closeLogFile()
63
	{
64
		if( isset($this->_fh) )
65
		{
66
			fflush($this->_fh);
67
			fclose($this->_fh);
68
			unset($this->_fh);
69
		}
70
	}
71

    
72
/*
73
 * @param  string $logdir: directory to place the logfile
74
 * @return bool: true if directory is valid and writeable
75
 * @description:
76
 */
77
	public function setLogDir( $logdir )
78
	{
79
		$this->_error = false;
80
		$retval = false;
81
		if( ($logdir = realpath($logdir)) )
82
		{
83
			$logdir = rtrim(str_replace('\\', '/', $logdir), '/');
84
			if( defined('WB_PATH') )
85
			{
86
				$sysroot = WB_PATH;
87
			}
88
			else
89
			{
90
				$script_filename = str_replace('\\', '/', $_SERVER['SCRIPT_FILENAME']);
91
				$script_name = str_replace('\\', '/', $_SERVER['SCRIPT_NAME']);
92
				$sysroot = str_replace($script_name, '', $script_filename);
93
			}
94
			if( stripos($logdir, $sysroot) === 0 )
95
			{
96
				if( is_writable($logdir))
97
				{
98
					if( file_exists($logdir.'/'.$this->_log_file) )
99
					{
100
						if( is_writable($logdir.'/'.$this->_log_file) )
101
						{
102
							$this->_log_path = $logdir.'/';
103
							$retval = true;
104
						}else
105
						{
106
							$this->_error = 'existing logfile is not writable! ['.$logdir.$this->_log_file.']';
107
						}
108
					}
109
					else
110
					{
111
						$this->_log_path = $logdir.'/';
112
						$retval = true;
113
					}
114
				}else
115
				{
116
					$this->_error = 'access denied for directory ['.$logdir.']';
117
				}
118
			}else
119
			{
120
				$this->_error = 'logdir [ '.$logdir.' ] points outside of DOCUMENT_ROOT [ '.$sysroot.' ]';
121
			}
122
		}else
123
		{
124
			$this->_error = 'logdir can not be resolved ['.$logdir.']';
125
		}
126
		return $retval;
127
	}
128

    
129
/*
130
 * @param string $line: preformatted message to write into the logfile
131
 * @return none: an error will throw a exception
132
 */
133
	protected function writeRaw( $message )
134
	{
135
		array_unshift( $message, (defined($_SESSION['USER_ID'])?$_SESSION['USER_ID']:0) );
136
		array_unshift( $message, (isset($_SERVER['REMOTE_ADDR'])?$_SERVER['REMOTE_ADDR']:'#') );
137
		array_unshift( $message, gmdate(DATE_W3C) );
138
		if( isset($this->_log_path) ){
139
			if($this->openLogFile())
140
			{
141
				if( fputcsv($this->_fh, $message, ',', '"') !== false )
142
				{
143
					$this->closeLogFile();
144
				}
145
				else
146
				{
147
					throw new Exception('unable to append line ['.$this->_log_path.$this->_log_file.']');
148
				}
149
			}
150
			else
151
			{
152
				throw new Exception('unable to open logfile ['.$this->_log_path.$this->_log_file.']');
153
			}
154
		}else
155
		{
156
			throw new Exception('undefined path for logfile ['.$this->_log_file.']');
157
		}
158
	}
159

    
160
} // end of class
161

    
162
/*
163
 *  Errorlog handler
164
 */
165
class ErrorLog extends LogFile{
166

    
167
	private static $_instance;
168

    
169
	protected function __construct()
170
	{
171
		parent::__construct('error.log');
172
	}
173

    
174
	private function __clone() {}
175

    
176
    public static function handle()
177
    {
178
        if (!isset(self::$_instance)) {
179
            $c = __CLASS__;
180
            self::$_instance = new $c;
181
        }
182
        return self::$_instance;
183
    }
184

    
185
/*
186
 * @param string $message: message to write into the logfile
187
 * @param string $file: (optional) name of the file where the error occures
188
 * @param string $function: (optional) name of the function where the error occures
189
 * @param string $line: (optional) number of the line where the error occures
190
 * @return none: an error will throw a exception
191
 */
192
	public function write( $message, $file = '#', $function = '#', $line = '#' )
193
	{
194
		if( !is_array($message) )
195
		{
196
			$message = array($file, $function, $line, $message);
197
		}
198
		self::handle()->writeRaw( $message );
199
	}
200
} // end of class
201

    
202
/*
203
 *  Accesslog handler
204
 */
205
class AccessLog extends LogFile{
206

    
207
	private static $_instance;
208

    
209
	protected function __construct()
210
	{
211
		parent::__construct('access.log');
212
	}
213

    
214
	private function __clone() {}
215

    
216
    public static function handle()
217
    {
218
        if (!isset(self::$_instance)) {
219
            $c = __CLASS__;
220
            self::$_instance = new $c;
221
        }
222
        return self::$_instance;
223
    }
224

    
225
/*
226
 * @param string $message: message to write into the logfile
227
 * @return none: an error will throw a exception
228
 */
229
	public function write( $message )
230
	{
231
		if( !is_array($message) )
232
		{
233
			$message = array($message);
234
		}
235
		self::handle()->writeRaw( $message );
236
	}
237
} // end of class
238

    
239

    
240
?>
(11-11/23)