Возникла задача заставить 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!