Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Как Echo использует lager

Как Echo использует lager

Avatar for Oleg Khabinov

Oleg Khabinov

July 18, 2013

More Decks by Oleg Khabinov

Other Decks in Programming

Transcript

  1. Lager • удобный в использовании, • легко настраиваемый, • расширяемый.

    Лагер использует эрланговский parse_transform, то есть все «вызовы» лагера на этапе компиляции трансформируются в lager:dispatch_log(...), куда передаётся уровень сообщения, информация о вызывающем модуле и т. п. Поэтому компилятору необходимо передать следующую опцию: {parse_transform, lager_transform}. Например, в конфигурационном файле ребара rebar.conf это выглядит так: {erl_opts, [ {parse_transform, lager_transform} ]}.
  2. Уровни сообщений Числа в таблице – это внутреннее для самого

    лагера представление уровней. Конвертировать числа в уровни и обратно можно с помощью функций: lager:level_to_num и lager:num_to_level. Это может понадобиться при реализации собственных бэкэндов для лагера. Писать в лог с помощью лагера можно следующим образом: lager:severity(Message, [Params]), где severity — один из уровней сообщений. Например: lager:debug("~p entries successfully stored, ~p skipped", [StoredCount, SkippedCount]). Сообщения со стандартным лагеровским форматтером будут выглядеть примерно так: 10:31:29.339 [debug] 2 entries successfully stored, 0 skipped. debug info notice warning error critical alert emergency 7 6 5 4 3 2 1 0
  3. Бэкэнды для лагера Лагер из коробки умеет писать в консоль

    или в файл, этим занимаются его стандартные бэкэнды: lager_console_backend и lager_file_backend. Если не хватает функциональности стандартных бэкэндов, и хочется делать с сообщениями что-то нестандартное, то всегда можно реализовать собственные бэкэнды.
  4. lager_console_backend Это самый простой бэкэнд из коробки, пишет в консоль.

    В нём можно установить уровень сообщений, и тогда все сообщения, равные этому уровню или выше, будут залогированы. Также в нём можно установить формат сообщений. Пример конфигурации: {lager_console_backend, info} Или так: {lager_console_backend, [info, {lager_default_formatter, [time," [",severity,"] ", message, "\n"]}} Поменять уровень «на лету» можно так: lager:set_loglevel(lager_console_backend, debug).
  5. lager_file_backend Стандартный бэкэнд для записи в файл. Позволяет для каждого

    уровня вести запись в отдельный файл, а также настраивать форматирование. Пример конфигурации: {lager_file_backend, [ [{"error.log", error, 10485760, "$D0", 5,{lager_default_formatter,[date, " ", time," [",severity,"] ",pid, " ", message, "\n"]}], {"console.log", info, 10485760, "$D0", 5} ]} В конфигурации также указаны параметры ротации файлов: первый параметр означает ротацию при превышении файлом 10 МБ, второй — ротацию каждый день в 0(24) часов, третий — хранить пять прошлых ротаций. Поменять уровень «на лету» можно так: lager:set_loglevel(lager_file_backend, "console.log", debug).
  6. Стандартный консольный бэкэнд не позволяет конфигурировать уровни сообщений отдельно для

    каждого модуля. Это послужило причиной создания собственного бэкэнда, у которого помимо общего уровня можно настраивать уровни сообщений для каждого модуля. Также нами был написан отдельный бэкэнд для работы с очередями RabbitMQ, мы используем его для отложенной записи логов. Кроме того реализован бэкэнд для работы с graphite, который используется нами как счётчик ошибок. Наши бэкэнды
  7. Форматтер Форматтер — модуль, занимающийся форматированием сообщений. В лагере есть

    готовый форматтер lager_default_formatter. Он вызывается внутри стандартных и реализованных нами бэкэндов примерно таким образом: lager_default_formatter:format(Message, FormatConfig), где FormatConfig - это формат, в котором будут затем сгенерированы сообщения. Пример такого конфига: [time," [",severity,"] ", message, "\n"] Лагер также позволяет создать собственный форматтер и использовать его вместо стандартного.
  8. Переходим на lager Таким образом, лагер позволил нам полностью избавиться

    от наших старых механизмов логирования благодаря следующим факторам: • удобные стандартные конфигурируемые бэкэнды плюс возможность написать свои; • конфигурируемый форматтер, а также возможность написать свой; • возможность реконфигурации лагера «на лету».
  9. На что ещё обратить внимание Трейсинг в файлы Лагер поддерживает

    перенаправление сообщений в файлы на основе атрибутов сообщений. Другие бэкэнды на главной странице проекта есть ссылки на другие сторонние бэкэнды https://github.com/basho/lager Crash и error_logger_redirect Лагер подписывается на события к error_logger. Это позволяет лагеру автоматически записывать все критические сообщения в файл crash.log (название файла конфигурируется), а также перенаправлять все сообщения из error_logger в lager.