Как правильно организовать логгирование?

  • Автор темы 2_crazy_bytes
  • Дата начала

2_crazy_bytes

Guest
Как правильно организовать логгирование?

Здравствуйте!
У меня возник вопрос, имеет ли следующий подход право на жизнь:

Для логгирования ошибок, сообщений, системных событий и т.д. используются различные наследники некоего класса Logger.
Чтобы получить экземпляр конкретного логгера надо вызвать метод класса LogManager, т.е. LogManager::getLogger('logger_name').
Для того, чтобы в классе можно было им (логгером) пользоваться, мне представляется сьедобным такой вариант:
PHP:
class Example {
	
	var $logger;

	function Example () {
		$this->logger =& LogManager::getLogger('deflog');
	}
}
Тогда в его потомках можно будет делать так:
PHP:
class ChildExample extends Example {
		
	function doAnything() {
		$this->logger->error('какая-то ошибка', /* и другие параметры */);
	}
}
Однако мне это не нравится по следующим причинам:
1) Всем остальным классам тоже придётся наследовать этот
2) вот это вот "$this->logger->error" выглядит как-то некрасиво

Заранее соглашусь, что доводы мои назвать серьёзными нельзя, но всё же вот ещё один вариант - сделать "функциональную прослойку":

PHP:
function set_error ($text, /* и другие параметры */) {
	$logger =& LogManager::getLogger('deflog');	
	$logger->error($text, /* все те же другие параметры */);
}
Аналогично для системных событий, сообщений пользователю и т.д.

В таком случае внутри классов достаточно будет вызвать set_тип_логгера, но мне это уже тем более кажется велосипедом, хотя всё же и способным ездить.
Так вот меня очень интресует мнение общественности по этому поводу, стоит ли использовать такой вариант ? Или может есть куда болеее правильный способ?
 

Gorath

Новичок
Ну если посмотреть на PEAR.. там в базовом классе обработка ошибок идет.
Соответственно ты можешь сделать базовый класс с зашитым туда логгером.. и от него все наследовать, в этом ничего страшного вроде нет :)
 

2_crazy_bytes

Guest
Спасибо за ответ, pear и навёл меня на верную мысль. Я остановился на таком решении:

В случае возникновения ошибки функци возвращают объект класса PEAR_Error.
Предварительно устанавливаю фукнцию обратного вызова через PEAR::setErrorHandling()

Соотвественно, в этой самой функции в зависимости от переданных параметров и вызывается соответствующий логгер.

Из-за этого не приходится ничего лишний раз наследовать и код становится гораздо опрятней =)
 
Сверху