Chronica это специальный фреймворк используемый для логирования сообщений в Erlang. Он осуществляет более простой способ введения журналов в Erlang-приложениях.
- Быстрее, легче, гибче!
- Вывод потока логов различными способами (в файл, на экран, по сети)
- Настраиваемые правила вывода (в виде регулярных выражений) и форматы вывода
- Индивидуальные форматы вывода для каждого backend'a
- Утилита для удалённого получения логов (grablog) по заданным правилам
- Легкая миграция проектов, ранее использующих lager
- Функции логирования не соответствующие заданному уровню логов не нагружают систему (неиспользуемые вызов фунций в коде удаляется на лету)
- Запись логов в двух режимах: бинарном (быстрый) и текстовом (удобный)
- Возможность реализации и добавления собственных backend'ов
- Поддержка unicode
- Ротация логов
- Поддержка цветного терминального вывода
- Возможность изменения правил фильтрации логов и уровня логирования на лету
- Возможность создания своих тегов для простой фильтрации логов
- Быстрый старт приложения при повторном запуске на узле
##Использование Для того, чтобы добавить Chronica в ваше приложение достаточно добавить её как Erlang зависимость (в app файле), а также выставить опции компиляции:
{parse_transform, pt_chronica}
Либо добавить заголовочный файл в каждом модуле использующем Chronica:
-include_lib("chronica/include/chronica.hrl").
(MAX) debug -> trace -> info -> warning -> (MIN) error
Также доступны пользовательские теги являющиеся атомами, использующиеся для выделения логов по каким-то критериям и расширяющие стандартные уровни логирования.
Форматы вызова фунций логирования:
Tag :: atom().
Tags :: [Tag()].
Level :: debug | trace | info | warning | error.
log:Level("String"),
log:Level("Format", [Args]),
log:Level(Tag, "Format", [Args]),
log:Level(Tags, "Format", [Args]),
Или используйте соответствующие макросы DBG, TRACE, INFO, WARN, ERR:
LEVEL(Format)
LEVEL(Format, Args)
Которые описаны в заголовочном файле:
-include_lib("chronica/include/chronica_macro.hrl").
Тегирование в Chronica позволяет создать группы уникальных логов, которые будут писаться в определенный backend для того чтобы была возможность быстро найти нужные сообщения. Cуществуют:
-
Пользовательские теги:
- Явные теги
log:error([my_teg], “test”).
- Неявные теги. Указываются в начале и применяются для всех логов данного модуля
-module(name). -chronica_tag(Tags).
-
Служебныe теги. Создаются во время compile-time. Такими тегами являются
- Тег имени модуля
- Тег имени модуля с указанием строки расположения данного log сообщения
Пример:
1 -module(testing).
2 -export([test/0]).
3 -include_lib("chronica/include/chronica.hrl").
4 test() ->
5 log:error(“test”).
После компиляции у log:error появится теги данного вида [testing, testing_5]
Из-за того, что в Chronica вычисление аргументов при вызове фунции логирования происходит внутри логера, вызов:
log:Level("~p", [erlang:get_stacktrace()])
для корректного вывода стека вызовов в логи преобразуется в
begin
Chronica_stacktrace_line = erlang:get_stacktrace(),
log:Level("~p", [Chronica_stacktrace_line]).
end
В правилах хорошего тона, лучше все вызовы, контекстно зависимые от процессора, выполнять в данном процессоре, а результаты помещать в переменную.
Применяется для того чтобы отследить участок кода, который считается незавершённым. Работает только с константными данными, и выводит данное напоминие как предупреждение компилятора.
Пример:
1 -module(testing).
2 -export([test/0]).
3 -include_lib("chronica/include/chronica.hrl").
4 test() ->
5 log:todo(“Need more tests!!!”).
Out:
(полный путь)/chronica_testing.erl:214: TODO: Need more tests!!!
Добавте секицю в sys.congig:
{chronica, [
Rules,
Flows,
Formats,
InternalLogger,
InternalLoggerFilename,
LogRoot,
MaxFileSize,
MaxFileNum,
LogIfacePath
]}
Rules - это список правил выборки сообщений в указанные Flows. Правило включает в себя имя, регулярное сообщение для отбора сообщений (может включать имя модуля или пользовательский тег), уровень логирования (error, warning, info, trace, debug), список Flow (потоков) в которыe будет происходить вывод попавших в данное правило сообщений, а также флаг состояние данного правила (включено оно или нет). Регулярное выражение может включать в себя служебные символы:
- "|" or
- "&" and
- "*" null or more any character
- "?" one ant character
- "!" not
Пример:
{warning_file_example1, “*”, warning, [warning_file], off},
данное правило будет проигнорировано
{warning_example2, “mysql*&!mysql_ag*”, error, [tty, error], on},
данное правило выполнит все логи уровня error модулей начинающихся с префикса mysql, но не mysql_ag.
{warning_file_example2, “my_tag”, warning, [warning_file], on},
данное правило выполнит все логи уровня warning или ниже, если у них
присутствует тег “my_tag”
Flows - это именованные потоки, которые пишут данные с помощью заданного backend (в файл, по сети, на экран). Так же здесь есть возможность задать режим: текстовый (удобный) или бинарный (быстрый).
Пример:
{warning_file, [{file, [{name, "debug.bin"}, {format, binary}]}]},
Поток будет писать в debug.bin, дефолтным форматом, в бинарном виде
{warning_file, [{file, [{name, "warning.txt"}]}]},
Поток будет писать в warning.txt, дефолтным форматом, в текстовом виде
{warning_file, [{tty, [{format, short}]}]},
Поток будет писать на консоль, short форматом, в текстовом виде
{journald, [{journald, [{format, short}]}]},
Поток будет писать в journald (Если установлен)
Задаёт форматирование текста. Состоит из макросов начинающихся со знака '%'. По умолчанию всегда задан 'default' формат, но его можно переназначить.
{formats,{ [ {default, “строка вывода”} ] }
Это переопределит стандартный способ вывода информации, для всех flows указанных без переопределенного заголовка из поля format.
default по умолчанию
{flows, [{screen, [{tty, [{format, default}]}]}]}
Out:
2015-09-27 14:59:32.012401 WARN <0.130.0> [testing_chronica_logs:testing_short_warning_file/1:57]: test chronica
```erlang
{full, "%Id %Y-%M(%Ml)-%D %H:%Mi:%S:%Ms %PRIORITY %P %Priority %Pid %File %Line %Module %Function %Message %MessageLine\n"}
{default, "%Y-%M-%D %H:%Mi:%S:%Ms %PRIORITY %Pid [%Module:%Line]: %Message\n"},
{short, "%Y-%M-%D %H:%Mi:%S:%Ms %P %Pid [%Module:%Line]: %Message\n"}
Chronica поддерживает три режима компиляции
- chronica optimization. Режим оптимизации (установленный по умолчанию). В данном режиме Chronica позволяет выводить предупреждения о переменных, которые объявлены в теле функции, но ипользуются только в вызовах log:level(...). Для того, чтобы не получать предупреждения, объявляйте переменные как \Var_.
- chronica default. Режим с выключенной оптимизацией. Раннее данный режим был по умолчанию
- chronica disabled. Режим в котором chronica вырезает log:level(...).
Предназначены для того, чтобы задать поведения chronica во время компиляции. Задаваться опции могут двумя способами
- С помощью переменных окружения:
- CHRONICA_MATCH_IGNORED_VAR
- CHRONICA_DISABLED
- CHRONICA_DEFAULT
- Через параметры компилятора erlang
- chronica_match_ignored_var
- chronica_disabled
- chronica_default
- Объявив поле compile(Option) в файле
- chronica_match_ignored_var
- chronica_disabled
- chronica_default
Данная опция используется в режиме chronica optimization и позволяет выводить переменные, которые были объявлены как \Var_.
Данная опция используется для включения режима chronica disabled
Данная опция используется для включения режима chronica default
Применяются для модифицирования конфигурационного файла
-
chronica_manager:update_rule_inwork(name_rule, false | true) Включает\отключает уже существующие правила.
-
chronica_manager:active(false | true) Включает\отключает Chronica.
-
chronica_manager:add_application(App) Регистрирует application во время работы Chronica.
-
chronica_manager:add_rule(Rule, Regexp, Level, Flow)
-
chronica_manager:add_rule(Rule, Regexp, Level, Flow, Fun) Добавляет новое правило во время работы Chronica и активирует его.