1: <?php
2:
3: namespace HZSystem\Core\Logger;
4:
5: use HZSystem\Core\Logger\Appenders;
6: use HZSystem\Core\Logger\Appenders\Appender_file;
7: use HZSystem\Core\Logger\Appenders\Appender_email;
8: use HZSystem\Core\Logger\Appenders\Appender_db;
9: use HZSystem\Core\Logger\Appenders\Appender_firephp;
10:
11: /*
12: * Copyright (C) 2015 Luca Liscio
13: *
14: * This program is free software: you can redistribute it and/or modify
15: * it under the terms of the GNU Affero General Public License as published by
16: * the Free Software Foundation, either version 3 of the License, or
17: * (at your option) any later version.
18: *
19: * This program is distributed in the hope that it will be useful,
20: * but WITHOUT ANY WARRANTY; without even the implied warranty of
21: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22: * GNU Affero General Public License for more details.
23: *
24: * You should have received a copy of the GNU Affero General Public License
25: * along with this program. If not, see <http://www.gnu.org/licenses/agpl-3.0.html>.
26: */
27:
28: /**
29: * Logger di sistema
30: *
31: * @author Luca Liscio <hzkight@h0model.org>
32: * @version 1.0.0 2015/12/16 13:01:20
33: * @copyright ©2015 Luca Liscio
34: * @license http://www.gnu.org/licenses/agpl-3.0.html GNU/AGPL3
35: *
36: * @package hzSystem
37: * @subpackage Core\Logger
38: * @filesource
39: */
40:
41: class HZLogger {
42:
43: // Errors level
44: /** Fatal error - higth level of error */
45: const LOG_FATAL = 404;
46: /** Normal error - medium level of error */
47: const LOG_ERROR = 403;
48: /** Warning - low level of error */
49: const LOG_WARNING = 402;
50: /** Info - info message */
51: const LOG_INFO = 401;
52: /** Debug - debug message */
53: const LOG_DEBUG = 400;
54:
55: // Appenders type
56: /** File type log */
57: const LOG_APPENDER_FILE = 501;
58: /** Email type log */
59: const LOG_APPENDER_EMAIL = 502;
60: /** Data base type log */
61: const LOG_APPENDER_DB = 503;
62: /** Firebug type log */
63: const LOG_APPENDER_FIREPHP = 504;
64:
65: //Dati del logger
66: private $logname;
67: private $date_format;
68: private $appenders = array();
69: private $loglevel;
70:
71: //Contiene le istanze del logger
72: private static $_instace = array();
73:
74: /**
75: * Crea una nuova istanza del logger
76: * @param string $logname nome della nuova istanza del logger da creare
77: * @param integer $type tipo di logger da creare
78: * @param integer $loglevel livello di errore da cui cominciare a registrare il log
79: * @return \HZSystem\Core\Logger\HZLogger
80: * @example $miolog = HZLogger::gelLogger("miolog",HZLogger::LOG_APPENDER_FILE,HZLogger::LOG_INFO);
81: */
82: public static function getLogger($logname,$type=self::LOG_APPENDER_FILE, $loglevel=self::LOG_INFO){
83:
84: if (!(self::$_instace[$logname] instanceof self)){
85: self::$_instace[$logname] = new self($logname,$type,$loglevel);
86: }
87:
88: return self::$_instace[$logname];
89: }
90:
91: /**
92: * Restituisce un array con tutte le istanze del logger
93: * @return HZSystem\Core\Logger\HZLogger
94: */
95: public static function getIstances(){
96:
97: return self::$_instace;
98:
99: }
100:
101: /**
102: * Metodo costruttore
103: * @param string $logname nome del logger
104: * @param integer $type tipo di logger da creare
105: * @param integer $loglevel livello di errore da cui cominciare a registrare il log
106: */
107: private function __construct($logname,$type,$loglevel){
108:
109: $this->logname = $logname;
110: $this->loglevel = $loglevel;
111: $this->add_appender($type);
112: $this->get_appender($type)->setLogLevel($this->loglevel);
113: $this->date_format = "d-m-Y H:i:s";
114:
115: }
116:
117: /**
118: * Aggiunge un nuovo appender al logger
119: * @param integer $type tipo di appender da aggiungere
120: */
121: public function add_appender($type){
122:
123: switch ($type){
124: case self::LOG_APPENDER_FILE:
125: $this->appenders[$type] = new Appender_file($this->logname);
126: break;
127: case self::LOG_APPENDER_EMAIL:
128: $this->appenders[$type] = new Appender_email($this->logname);
129: break;
130: case self::LOG_APPENDER_DB:
131: $this->appenders[$type] = new Appender_db($this->logname);
132: break;
133: case self::LOG_APPENDER_FIREPHP:
134: $this->appenders[$type] = new Appender_firephp($this->logname);
135: break;
136: }
137:
138: $this->get_appender($type)->setLogLevel($this->loglevel);
139:
140: }
141:
142: /**
143: * Rimuove un appender dal logger
144: * @param integer $type tipo di appender da rimuovere
145: * @throws AppenderNotFoundException
146: */
147: public function remove_appender($type){
148:
149: if(isset($this->appenders[$type])){
150: unset($this->appenders[$type]);
151: } else {
152: throw new AppenderNotFoundException(dgettext("hzSystem","Appender requested not found"));
153: }
154:
155: }
156:
157: /**
158: * restituisce l'appender associato al tipo specifiato
159: * @param integer $type tipo di appender che si vuole ottenere
160: * @throws AppenderNotFoundException
161: * @return HZSystem\Core\Logger\Appenders\Appender
162: */
163: public function get_appender($type){
164:
165: if(isset($this->appenders[$type])){
166: return $this->appenders[$type];
167: } else {
168: throw new AppenderNotFoundException(dgettext("hzSystem","Appender requested not found"));
169: }
170:
171: }
172:
173: /**
174: * Restituisce la lista degli appenders attivi sotto forma di array
175: * bidimensionale [codice][tipo]
176: * @return string
177: */
178: public function get_appenders_list(){
179:
180: $list = array();
181:
182: $keys = array_keys($this->appenders);
183:
184: foreach($keys as $key){
185:
186: switch ($key){
187: case self::LOG_APPENDER_FILE:
188: $list[][0] = self::LOG_APPENDER_FILE;
189: $list[][1] = "FILE";
190: break;
191: case self::LOG_APPENDER_EMAIL:
192: $list[][0] = self::LOG_APPENDER_EMAIL;
193: $list[][1] = "EMAIL";
194: break;
195: case self::LOG_APPENDER_DB:
196: $list[][0] = self::LOG_APPENDER_DB;
197: $list[][1] = "DB";
198: break;
199: case self::LOG_APPENDER_FIREPHP:
200: $list[][0] = self::LOG_APPENDER_FIREPHP;
201: $list[][1] = "FIREPHP";
202: break;
203: }
204:
205: }
206:
207: return $list;
208:
209: }
210:
211: /**
212: * setta il formato data del log usa la stessa sintassi del comando date di php
213: * @param string $date_format
214: */
215: public function setDateFormat($date_format){
216:
217: $this->date_format = $date_format;
218:
219: }
220:
221: /**
222: * Aggiunge una riga la log
223: * @param integer $level livello dell'errore
224: * @param string $msg messaggio di errore
225: */
226: public function append($level, $msg){
227:
228: $logrow = new HZLogRow();
229: $logrow->date = date($this->date_format);
230: $logrow->message = $msg;
231: $logrow->type = $level;
232:
233: $keys = array_keys($this->appenders);
234:
235: foreach($keys as $key){
236: $this->appenders[$key]->add($logrow);
237: }
238:
239: }
240:
241: /**
242: * Aggiunge una riga la log di tipo fatal
243: * @param string $msg messaggio di errore
244: */
245: public function fatal($msg){
246: $this->append(self::LOG_FATAL, $msg);
247: }
248:
249: /**
250: * Aggiunge una riga la log di tipo error
251: * @param string $msg messaggio di errore
252: */
253: public function error($msg){
254: $this->append(self::LOG_ERROR, $msg);
255: }
256:
257: /**
258: * Aggiunge una riga la log di tipo warning
259: * @param string $msg messaggio di errore
260: */
261: public function warning($msg){
262: $this->append(self::LOG_WARNING, $msg);
263: }
264:
265: /**
266: * Aggiunge una riga la log di tipo info
267: * @param string $msg messaggio di errore
268: */
269: public function info($msg){
270: $this->append(self::LOG_INFO, $msg);
271: }
272:
273: /**
274: * Aggiunge una riga la log di tipo debug
275: * @param string $msg messaggio di errore
276: */
277: public function debug($msg){
278: $this->append(self::LOG_DEBUG, $msg);
279: }
280:
281: }
282: ?>