Main

Programming Use Logger

Поскольку порог вхождения в MajorDoMo всё ещё велик, то очень часто на помощь приходит логирование. MajorDoMo использует библиотеку log4php, а из этого вытекает очень гибкое конфигурирование логирования. Так же MajorDoMo предлагает обёртку getLogger($context = null) над log4php для логирования. Особенностью getLogger является то, что он может получать "умное" имя логера для указаного контекста. К примеру:

  • Если $context не указан или это пустая строка, тогда вернётся основной логер (имя root)
  • Если $context это имя существующего файла или пути к файлу, тогда вернётся логер с именем page.filename
  • Если $context это просто строка, тогда вернётся логер с именем равным этой строке
  • Если $context это экземпляр объекта, тогда имя логера будет зависить от класса объекта
    • Для объектов которые создаются MajorDoMo панели управления - class.object.имя_объекта
    • Для модулей MajorDoMo - class.module.имя_модуля
    • Для все остальных экзепляров - class.имя_класса

Несколько примеров получения логера из кода

  • $log = getLogger($this); - рекомендуемое получение логера из методов объекта (объекты которые создаются в панели управления)
  • $log = getLogger(__FILE__); - рекомендуемое получение логера из php файла, где у вас нет никаких классов
  • $log = getLogger('MyLogger'); - вы хотите указать специфическое имя логера
  • $log = getLogger(); - вам не важно какое будет имя логера

Ну и конечно же пример конфигурирования логеров в /lib/log4php/config.xml. Следующая конфигурация говорит что нужно писать событи уровня TRACE и важнее в отдельный файл. В это же время все другие события будут попадать в лог только если это ошибки. Это класический пример конфигурации когда дебажится поведение в объектах.

    <logger name="class.object" additivity="false">
        <level value="TRACE" />
        <appender_ref ref="objectsFileLog" />
    </logger>
   <root>
      <level value="ERROR" />
      <appender_ref ref="default" />
   </root>

Теперь логи выглядят чуточку читабельней

 21:52:50 TRACE [page.megad]: Got message from MegaDevice (192.168.0.20, pt=1)
 21:52:50 TRACE [page.megad]: Object Bedroom2Light will process call
 21:52:50 TRACE [class.object.Bedroom2Light]: getOutputPortState method: get state of output = 11 
 21:52:50 TRACE [class.object.MegaD1]: getOutput method: http://192.168.0.20/sec/?pt=11&cmd=get returned ON 
 21:52:50 TRACE [class.object.MegaD1]: getOutput method: set Bedroom2Light.enabled = 1 
 21:52:50 TRACE [class.object.Bedroom2Light]: switchOff method: set output = 11 to 0 
 21:52:50 TRACE [class.object.MegaD1]: setOutput method: http://192.168.0.20/sec/?cmd=11:0 

В качестве бонуса новое логирование ошибок в objects.class.php будет выглядеть

 21:52:50 ERROR [class.object.MegaD1]: Error in "MegaD1.GetOutput" method. Code: $param['name'] = 1

Посмотреть больше примеров создания логеров можно в юниттестах

 

MajorDomo

Информация

Проекты

Партнёры

edit SideBar

 
 
 

 

Blix theme adapted by David Gilbert, powered by PmWiki