Ошибка в common.class.php

Проблемы/вопросы, связанные с запуском под различными платформами и конфигурациями.

Модератор: immortal

LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Контактная информация:

Re: Ошибка в common.class.php

Сообщение 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);
В остальном можно и через метод вызывать.
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Контактная информация:

Re: Ошибка в common.class.php

Сообщение LutsenkoDenis »

с git пока не сильно дружу(на работе юзаем svn), так-что заранее прошу прощения у Cергея если чего не так отправил на комит :)
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
dimitrystd
Сообщения: 80
Зарегистрирован: Пн апр 01, 2013 10:20 pm
Откуда: Днепропетровск

Re: Ошибка в common.class.php

Сообщение dimitrystd »

LutsenkoDenis писал(а):по поводу log4php:
1. Настройки в xml
2. Пример
Спасибо за пример. Тут у меня мысли:
- То что можно самому указать имя логера это хорошо. Самое главное как вы сейчас рефакторите классы МДМ? Вы везде харкодите getLogger('MajorDomo')? Тогда это будет не гибко как и DebMes. Единственный плюс что можно глобально вкл\выкл, а не бегать коментировать.
- Если все будут руками забивать имя логера, то будут опечатки (как например опечатка в скл скрипте которую вы правили). И потом сиди думай почему логи не пишутся как надо. Ну и вообще лень набирать лишний текст :D
- Хорошо бы чтоб оно само генерило имя логера по известным правилам. У каждого будет ожидание как можно оттюнить логирование для проблемного куска. Например мне сейчас нужны логи связаные только с snmp + commons клас. Я бы мог включить дебаг левел двумя строками при этом не меняя код МДМ. Больше всего расстаивает когда твои изменеия перетираются при обновлении. И ты понимаешь что твои выкрутасы с логированием никому не нужны в основной ветке.
LutsenkoDenis писал(а):с git пока не сильно дружу(на работе юзаем svn), так-что заранее прошу прощения у Cергея если чего не так отправил на комит :)
Т.е. после мержа пул-реквеста можно будет обновлять систему и наслаждаться?
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Контактная информация:

Re: Ошибка в common.class.php

Сообщение LutsenkoDenis »

1. Ну, на самом деле я пока в качестве эксперимента добавил логирование ошибок только при работе с БД(при SELECT, UPDATE и тд) в классе error.class.php
2. Хардкодить не люблю, но пока захардкодил. :(
3. Вопрос в другом, по имени логера выбирается правило. Если имя логера будет автогенерённым, то прийдётся как-то генерить правила.

MDM рефакторю только для того, чтобы понять как работает система, ну и для удобства чтения кода. поэтому изменения в основную ветку от меня сейчас много, но по факту там в основном расстановка переносов, выравнивание и т.д.
Т.е. по факту моих там только два изменения - это изменение метода на $_REQUEST в gps.php и попытка добавить логирование на log4php.

Сделал класс по получению данных о погоде с openweathermap, но до сих пор не могу врубиться как подключить его к MDM.
5. Е
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Контактная информация:

Re: Ошибка в common.class.php

Сообщение LutsenkoDenis »

p.s. пул-реквест в описанным log4php я отправил. Так что да, в случае слияния в основную ветку можно будет немного порадоваться и начинать допиливать с учётом поступивших пожеланий. :)
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
dimitrystd
Сообщения: 80
Зарегистрирован: Пн апр 01, 2013 10:20 pm
Откуда: Днепропетровск

Re: Ошибка в common.class.php

Сообщение dimitrystd »

LutsenkoDenis писал(а):3. Вопрос в другом, по имени логера выбирается правило. Если имя логера будет автогенерённым, то прийдётся как-то генерить правила.
Непонял про какие правила идёт речь. Систему поставлять с одной единственной настройкой - рут логер пишет все INFO или WARN в один файл (как у вас в примере хмл). А вот кому надо включить логирование чтоб все потроха работы с объектами логировались, тот и напишет

Код: Выделить всё

<logger name="majordomo.objects">
  <level value="DEBUG" />
  <appender_ref ref="fileAppender" />
</logger>
Так человек напишет потому что знает что имя логера берётся по имени класса (или например пути к файлу - majordomo.objects.objects). В общем самое главное чтоб в именах было предсказуемое поведение, а не сленг отдельно взятого девелопера.
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Контактная информация:

Re: Ошибка в common.class.php

Сообщение LutsenkoDenis »

Как оказалось getLogger() работает несколько иначе.

Как я понял работает он следующим образом:
при вызове getLogger('MajorDomo') если находит правило с именем MajorDomo в конфиге, то отрабатывает так, как указано в данном правиле.

Если не находит, то создаёт новое имя правила(не записывая в конфиг) и отрабатывает его как дефолтное.

То есть в принципе его можно вызывать например так: getLogger(__CLASS__)
правило будет называться также как и имя класса.

В конфиге изменяем поле conversationPattern, дописывая в значение [%logger]
Соответственно в логе будет запись о том кто вызвал логгирование(класс\правило)

з.ы. включать\отключать логгирование для дебага не вижу смысла. Так как по сути дебаг и логгирование немного разные вещи.
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
dimitrystd
Сообщения: 80
Зарегистрирован: Пн апр 01, 2013 10:20 pm
Откуда: Днепропетровск

Re: Ошибка в common.class.php

Сообщение dimitrystd »

Спасибо за пример getLogger(__CLASS__), этого мне будет достаточно
Про дебаг и логи. Тут на форуме много людей далеких от программирования и радиоэлектронники, хотя руки правильно растут. Я например с ходу не смог настроить дебаг для моего инстанса МДМ. Поэтому не брезгуем дебагом через лог :)
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Контактная информация:

Re: Ошибка в common.class.php

Сообщение 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 функции. Если кто знает как это сделать раскажите плиз.
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
Ответить