Страница 2 из 2
Re: Ошибка в common.class.php
Добавлено: Чт сен 05, 2013 10:39 pm
LutsenkoDenis
по поводу log4php:
1. Настройки в xml
2. Пример
Код: Выделить всё
<configuration xmlns="http://logging.apache.org/log4php/">
<appender name="MajorDomo" class="LoggerAppenderFile">
<layout class="LoggerLayoutPattern">
<param name="conversionPattern" value="%date [%level] File: %file Line: %line %newline Message: %message%newline%newline" />
</layout>
<param name="file" value="Log/logfile.log" />
</appender>
<root>
<level value="INFO" />
<appender_ref ref="MajorDomo" />
</root>
</configuration>
Использование:
Код: Выделить всё
$script = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
$description = "Script: " . $script . "\nError: " . $description;
$log = Logger::getLogger('MajorDomo');
$log->fatal($description);
В остальном можно и через метод вызывать.
Re: Ошибка в common.class.php
Добавлено: Чт сен 05, 2013 10:42 pm
LutsenkoDenis
с git пока не сильно дружу(на работе юзаем svn), так-что заранее прошу прощения у Cергея если чего не так отправил на комит

Re: Ошибка в common.class.php
Добавлено: Пт сен 06, 2013 12:59 pm
dimitrystd
LutsenkoDenis писал(а):по поводу log4php:
1. Настройки в xml
2. Пример
Спасибо за пример. Тут у меня мысли:
- То что можно самому указать имя логера это хорошо. Самое главное как вы сейчас рефакторите классы МДМ? Вы везде харкодите getLogger('MajorDomo')? Тогда это будет не гибко как и DebMes. Единственный плюс что можно глобально вкл\выкл, а не бегать коментировать.
- Если все будут руками забивать имя логера, то будут опечатки (как например опечатка в скл скрипте которую вы правили). И потом сиди думай почему логи не пишутся как надо. Ну и вообще лень набирать лишний текст

- Хорошо бы чтоб оно само генерило имя логера по известным правилам. У каждого будет ожидание как можно оттюнить логирование для проблемного куска. Например мне сейчас нужны логи связаные только с snmp + commons клас. Я бы мог включить дебаг левел двумя строками при этом не меняя код МДМ. Больше всего расстаивает когда твои изменеия перетираются при обновлении. И ты понимаешь что твои выкрутасы с логированием никому не нужны в основной ветке.
LutsenkoDenis писал(а):с git пока не сильно дружу(на работе юзаем svn), так-что заранее прошу прощения у Cергея если чего не так отправил на комит

Т.е. после мержа пул-реквеста можно будет обновлять систему и наслаждаться?
Re: Ошибка в common.class.php
Добавлено: Пт сен 06, 2013 2:10 pm
LutsenkoDenis
1. Ну, на самом деле я пока в качестве эксперимента добавил логирование ошибок только при работе с БД(при SELECT, UPDATE и тд) в классе error.class.php
2. Хардкодить не люблю, но пока захардкодил.

3. Вопрос в другом, по имени логера выбирается правило. Если имя логера будет автогенерённым, то прийдётся как-то генерить правила.
MDM рефакторю только для того, чтобы понять как работает система, ну и для удобства чтения кода. поэтому изменения в основную ветку от меня сейчас много, но по факту там в основном расстановка переносов, выравнивание и т.д.
Т.е. по факту моих там только два изменения - это изменение метода на $_REQUEST в gps.php и попытка добавить логирование на log4php.
Сделал класс по получению данных о погоде с openweathermap, но до сих пор не могу врубиться как подключить его к MDM.
5. Е
Re: Ошибка в common.class.php
Добавлено: Пт сен 06, 2013 2:14 pm
LutsenkoDenis
p.s. пул-реквест в описанным log4php я отправил. Так что да, в случае слияния в основную ветку можно будет немного порадоваться и начинать допиливать с учётом поступивших пожеланий.

Re: Ошибка в common.class.php
Добавлено: Пт сен 06, 2013 8:17 pm
dimitrystd
LutsenkoDenis писал(а):3. Вопрос в другом, по имени логера выбирается правило. Если имя логера будет автогенерённым, то прийдётся как-то генерить правила.
Непонял про какие правила идёт речь. Систему поставлять с одной единственной настройкой - рут логер пишет все INFO или WARN в один файл (как у вас в примере хмл). А вот кому надо включить логирование чтоб все потроха работы с объектами логировались, тот и напишет
Код: Выделить всё
<logger name="majordomo.objects">
<level value="DEBUG" />
<appender_ref ref="fileAppender" />
</logger>
Так человек напишет потому что знает что имя логера берётся по имени класса (или например пути к файлу -
majordomo.objects.objects). В общем самое главное чтоб в именах было предсказуемое поведение, а не сленг отдельно взятого девелопера.
Re: Ошибка в common.class.php
Добавлено: Вт сен 10, 2013 9:19 am
LutsenkoDenis
Как оказалось getLogger() работает несколько иначе.
Как я понял работает он следующим образом:
при вызове getLogger('MajorDomo') если находит правило с именем MajorDomo в конфиге, то отрабатывает так, как указано в данном правиле.
Если не находит, то создаёт новое имя правила(не записывая в конфиг) и отрабатывает его как дефолтное.
То есть в принципе его можно вызывать например так: getLogger(__CLASS__)
правило будет называться также как и имя класса.
В конфиге изменяем поле conversationPattern, дописывая в значение [%logger]
Соответственно в логе будет запись о том кто вызвал логгирование(класс\правило)
з.ы. включать\отключать логгирование для дебага не вижу смысла. Так как по сути дебаг и логгирование немного разные вещи.
Re: Ошибка в common.class.php
Добавлено: Вт сен 10, 2013 8:11 pm
dimitrystd
Спасибо за пример getLogger(__CLASS__), этого мне будет достаточно
Про дебаг и логи. Тут на форуме много людей далеких от программирования и радиоэлектронники, хотя руки правильно растут. Я например с ходу не смог настроить дебаг для моего инстанса МДМ. Поэтому не брезгуем дебагом через лог

Re: Ошибка в common.class.php
Добавлено: Ср сен 11, 2013 11:19 pm
LutsenkoDenis
Вот что у меня получилось в итоге:
Конфиг:
Код: Выделить всё
<?xml version="1.0" encoding="utf-8" ?>
<configuration xmlns="http://logging.apache.org/log4php/">
<appender name="default" class="LoggerAppenderDailyFile">
<layout class="LoggerLayoutPattern">
<param name="conversionPattern" value="%d{H:i:s} %p [%c]: %m (at %F:%L) %x%n" />
</layout>
<param name="file" value="Log/%s.log" />
<param name="datePattern" value="Y-m-d" />
</appender>
<root>
<level value="TRACE" />
<appender_ref ref="default" />
</root>
</configuration>
С данным конфигом имеем следующее:
1. Логи создаются каждый день.
2. Имя лог-файла генерится по дате.
3. В логе указывается:
- а) Дата
б) Уровень логирования(Error,Debug,Fatal и т.д) Описание: http://logging.apache.org/log4php/docs/ ... ction.html
в) Метод который вызвал(название класса:функция)
г) Скрипт, при выполнении которого произошло событие
д) Сообщение
е) Файл и номер строки в котором произошло событие
Пример: - фатальная ошибка
Ставим проверку на выполнение sql апросов к базе.
Файл: "/majordomo/lib/errors.class.php"
Функия: error($description, $stop = 0, $short)
Код: Выделить всё
// вызываем логгер
$log = Logger::getLogger(__METHOD__);
// урл
$script = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
// сообщение об ошибке
$description = "Script: " . $script . "\nError: " . $description;
// запись в лог
$log->fatal($description);
При обращении к несуществующей таблице в БД получим в логе сообщение:
Код: Выделить всё
22:13:52 FATAL [error::error]: Script: http://192.168.1.7/admin.php?pd=pz_&md=panel&inst=&action=scripts
Error: 1146: Table 'majordomo.scripts' doesn't exist<br />SELECT scripts.*, script_categories.TITLE as CATEGORY FROM scripts LEFT JOIN script_categories ON scripts.CATEGORY_ID=script_categories.ID WHERE 1 ORDER BY script_categories.TITLE, scripts.TITLE (at /mnt/majordomo/lib/errors.class.php:41)
Обычные сообщения при дебаге можно писать в лог с уровнем TRACE или DEBUG, кому как нравится.
Итог:
1. Логи можно открывать за определённый день.
2. Можно искать в логе по определённому уровню.
3. Конфиг можно настроить конфиг логов под себя.
з.ы. У меня не получилось селать проверку выполнения eval функции. Если кто знает как это сделать раскажите плиз.