Как развести lager по разным файлам

162 views
Skip to first unread message

Grey Kristy

unread,
Mar 21, 2014, 10:29:05 AM3/21/14
to erlang-...@googlegroups.com
Возникла задача заставить lager писать разные лог-данные в разные файлы. Типичные пример - скажем вы подключаетесь к нескольким источникам данных, и логи общения с каждым источником хочется записывать в отдельные файлы, а не искать их в одном горамадном общем логе. Лагер, как  известно, можно легко сконфигурировать так, что бы разные уровня логирования (debug, warning, error, ...) писались в разные файлы. А вот  задача разделения лог файлов по произвольным признакам в документации в прямую не описана. В интернете я тоже ничего похоже не нашел, так что решил записать - вдруг кому пригодится. На самом деле это совсем не сложно.

1. Описываем в конфиг файле несколько файлов для логов

   {lager, [
        {handlers, [
            {lager_file_backend, [{file, "log/foo.log"}, {level, emergency}]},
            {lager_file_backend, [{file, "log/bar.log"}, {level, emergency}]},
        ]},
    ]}

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

2. Дальше нам нужно по какому-то признаку отфильтровать, какая информация в какой лог файл попадет. Для фильтрации можно использовать любую информацию, которую lager уже знает (pid, module, line, ...). А можно добавить свою информацию. Мне удобнее фильтровать по своей информации, поэтому я вызываю лагер примерно так:

lager:error([{channel, foo}], "Some message: ~p", [42])
lager:error([{channel, bar}], “Other message: ~p", [24])

3. Собственно фильтрация. После старта лагера, при инициализации вашего приложения (например в application behaviour)

lager:trace_file("log/foo.log", [{channel, foo}], debug),
lager:trace_file("log/bar.log", [{channel, bar}], debug)

4. Profit!

Igor Karymov

unread,
Mar 21, 2014, 10:34:51 AM3/21/14
to erlang-...@googlegroups.com
Думаю, что подобный способ, близок к отсутствию возможности.
Причины две:
 * хардкод файла в коде.
 * приоритет emergency в может пригодится по прямому назначению.

пятница, 21 марта 2014 г., 18:29:05 UTC+4 пользователь Grey Kristy написал:

Maxim Velesyuk

unread,
Mar 21, 2014, 4:56:00 PM3/21/14
to erlang-...@googlegroups.com
Собственно как уже сказали пляски с уровнями логирования и хардкодом настроек в модули в данном случае совершенно ни к чему. У нас например есть такие строчки в конфиге:
{lager,
[{handlers,[{lager_file_backend, [{file, "log/db.log"}, {level, none}]}]},
{traces, [{{lager_file_backend, "log/db.log"}, [{tag, dblog}], '<=error'}]}
]}

Grey Kristy

unread,
Mar 22, 2014, 5:16:50 AM3/22/14
to erlang-...@googlegroups.com
Ну вот, как полезно читать erlnag-ru :)


А я так и не смог придумать способ, как прописать это в конфиг

Grey Kristy

unread,
Mar 22, 2014, 5:18:48 AM3/22/14
to erlang-...@googlegroups.com


On Friday, March 21, 2014 6:34:51 PM UTC+4, Igor Karymov wrote:
Думаю, что подобный способ, близок к отсутствию возможности.
Причины две:
 * хардкод файла в коде.
 * приоритет emergency в может пригодится по прямому назначению.

 
Ну на самом деле у меня конечно нет никакого хардкода, все хандлеры выбираются из конфига лагера.
Но, как справедливо написано ниже, это тоже не требуется

Max Lapshin

unread,
Mar 22, 2014, 6:18:21 AM3/22/14
to erlang-...@googlegroups.com
Я не понимаю логики по которой в трейс-файлы попадают сообщения, не попадающие под фильтр, но выше приоритетом.
Reply all
Reply to author
Forward
0 new messages