Skip to content
loguntsov edited this page Dec 10, 2011 · 14 revisions

Возможности

Alogger - это простой для конфигурации и использования логгер для erlang'a. Используя alogger выполучаете:

  • Возможность написать свой собственный логгирующий модуль и интегрировать его в систему в рантайме.
  • Для каждого модуля и приоритета логгирования вы можете настроить необходимый логгирующий модуль. Так же существует настройка по тегам в независимости от модулей.
  • Изменение приоритета логгирования осуществляется на лету. Без какого-либо overhead'a. Это значит что фильтрация лог-сообщений происходит максимально быстро. Спасибо parse_transform :-)
  • Перехват сообщений error-logger'a. Если до alogger'a вы использовали обычный error-logger, вам не нужно переписывать ваш код. В alogger предусмотрена возможность перехватывать сообщения error-logger'a и перенаправлять их в необходимый логгирующий модуль. Включен по умолчанию
  • Магия parse_transform так же позволяет сократить ваши лог-сообщения в модулях. Это очень удобно для отладочных целей :-)

Готовые логгирующие модули

  • alog_tty: просто принтауты. Используется io:format/2.
  • alog_syslog: интерфейс для syslog.
  • alog_scribe: интерфейс для scribe.
  • alog_disk_log: интерфейс для disk_log

Приоритеты логгирования

В alogger представлено 8 приоритетов логгирования.

Приоритет Описание
0. emergency Система вышла из строя
1. alert Сделайте что-нибудь немедленно!
2. critical Критическое состояние
3. error Ошибка
4. warning Серьезное предупреждение
5. notice Предупреждение
6. info Информационное сообщение
7. debug debug-level сообщение

Чем серьезнее ошибка, тем меньше её номер. Это нужно учитывать при конфигурации фильтра в flows. Например, warning > critical, emergency < info или error < debug.

Использование

Для того чтобы начать использовать alogger в своем проекте вам достаточно добавить его в rebar.config своего проекта в секцию зависимостей deps. Делается это так:

{deps, [{alog, ".*", {git, "git://github.com/siberian-fast-food/alogger.git", "master"}}]}.

По умолчанию потоки логгирования (flows) в alogger настроены так, чтобы лог-сообщения печатались в консоль внезависимости от модуля в котором расположен макрос логгирования.

Далее включите заголовочный файл alog.hrl в заголовок модуля в котором необходимо логгирование:

 ...
  -include_lib("alog.hrl").
 ... 

В заговочном файле содержатся макросы, которые следуется использовать в вашем коде. Допустим, что flows у вас следующие (те, что по умолчанию):

(alog_dev@garry-desktop)5\> alog_control:get_flows().
{ok,[{flow,2,{mod,['_']},{'=<',debug},[alog_tty],true},
     {flow,1,
           {mod,[alog_examples]},
           {'=<',debug},
           [alog_tty],
           true}]}

Пример:

parse_header(H) ->
    ...
    {ok, HeaderSize, Data} = strip_header(H),
    ?DEBUG("Size = ~p Data = ~p",[HeaderSize, Data], header_test),
    ok.

В консоли вы увидите следующее сообщение:

2011-11-12 19:39:03:362285 test_module:456:debug [<0.52.0>]->[header_test]: Size = 16 Data = "MyData"

Описание по порядку:

  • 2011-11-12 - дата
  • 19:39:03:362285 - время
  • test_module - имя модуля
  • 456 - номер строки
  • debug - приоритет лог-сообщения
  • [<0.52.0>] - идентификатор процесса, написавшего в лог
  • [header_test] - тег сообщения. Третий параметр в макросе ?DEBUG
  • Size = 16 Data = "MyData" - отформатированное лог-сообщение.

Также стоит заметить, что функция логгирования вызывается в контексте процесса писавшего в лог. Т.е. alogger не создает для записей дополнительных процессов и не обменивается сообщениями ни с процессами в контексте которых вызывается макрос записи в лог, ни с самим логерами.

С остальными макросами вы можете ознакомиться в alog.hrl

Магия "parse_transform"

Настройка flows

От настройки потоков логгирования (flows) зависит из каких модулей и какие лог-сообщения у вас будут посылаться в необходимый логгер. Потоки логгирования по умолчанию находятся в priv/alog.config

Рассмотрим секцию flows из этого файла:

 

...
         {flows, [
                  {{mod, ['_']},{'=<', debug}, [alog_tty]},
                  {{mod, [alog_examples]}, {'=<', debug},[alog_tty]}
                 ]},

... 

Каждый поток логгирования описывается следующим образом:

{Filter, PriorityPattern, Loggers}

Т.е. для первого потока из файла alog.config:

  • Filter : {mod, ['_']}
  • PriorityPattern : {'=<', debug}
  • Loggers : [alog_tty]

Это означает, что из любого модуля лог-сообщения, приоритет которых меньше или равен debug, будут посланы в логгер alog_tty.

Filter

Здесь вы можете указать модули из которых лог-сообщения будут залогированны. Также возможно логгирование по тегам. Т.е. при написании лог-сообщения вы указываете его тег и в этом случае в соответствии с этим flow логгирование будет вестись в независимости от модулей.

Логгирование по модулям

Например:

{{mod, [alog_examples]}, ... , ... }

В этом flow будут учитываться только лог-сообщения из модуля alog_examples. Модули могут задаваться следующим образом:

  1. {{mod, [mod1, mod2, mod3]}, ... , ... } - где mod1,mod2,mod3 модули, лог-сообщения из которых должны быть залогированы

  2. {{mod, ['_']}, ... , ... } - логгировать все модули.

  3. {{mod, [{'_', not_for, [modnolog1, modnolog2]}]}, ... , ... } - логгировать все модули, кроме modnolog1, modnolog2.

Логгирование по тегам

Фильтрация лог-сообщений происходит с помощью тегов в независимости от того в каком модуле они расположены. Пример:

{{tag, [mytag1]}, ... , ... }

Тег может быть задан в логгирующем макросе. Также в одном макросе может быть несколько тегов:

?DBG("~p", ["hello"], [mytag1, mytag2]).

Возможные значения:

  1. {{tag, [tag1, tag2, tag3]}, ... , ... } - лог-сообщения с тегами tag1, tag2, tag3 будут залоггированы.

  2. {{tag, ['_']}, ... , ... } - логгировать лог-сообщения с любыми тегами.

PriorityPattern

Определяет какого приоритета сообщения должны быть залоггированы. Возможные приоритеты указаны выше.

Пример:

{ ... , [{'=<',debug}, {'>=', emergency}] , ... }

В этом примере будут залоггированы сообщения у которых приоритет больше или равен debug, но меньше или равен warning. Т.е. сообщения с приоритетами debug, info, notice, warning будут залоггированы, однако, сообщения с приоритетами error, critical, alert, emergency залоггированы НЕ будут.

Возможные знаки сравнения:

  • >
  • <
  • ==
  • =<
  • >=
  • /=

Также можно просто перечислить приоритеты которые необходимо залоггировать:

{ ... , [debug, alert, emergency] , ... }

Loggers

Список логгеров. Логгеры "из коробки" указаны выше.

Настройка потоков логгирования в рантайме - alog_control