Lager должен писать откуда вызвана функция логирования.

114 views
Skip to first unread message

begemot_sun

unread,
Jul 10, 2014, 3:13:46 AM7/10/14
to erlang-...@googlegroups.com
Есть некая функция логирования:

-module(log).
-ecport([ log/2 ]).

log(Format, Data) ->
    lager:info(Format, Data).

Есть некий модуль c логируемой функцией:

-module(a).

a() ->
 log:log("Hello ~p", [ 1 ]).

При выполнении функции в лог-файле всегда будет указан log-модуль откуда вызван лагер. 

Как можно сделать так, чтобы в лог файле было указание на то, откуда вызвана log-функция ? 

Т.е. lager как-то должен подняться по stacktrace на 1 ступень выше и написать модуль и строку. 

P.S. Было предложение использовать макросы вместо модуля, но хочется использовать именно некоторую log-функцию.

Какие могут быть решения указанной проблемы ? 

Denis Fakhrtdinov

unread,
Jul 10, 2014, 3:23:23 AM7/10/14
to erlang-...@googlegroups.com
А почему необходимо использовать именно функцию? Необходимо реализовать какую-то сложную логику в ней? В таком случае я бы предложил использовать и макрос, и функцию.
-define(log(Msg, Args), yourmodule:yourfunction([{module, ?MODULE}, {foo, bar}], Msg, Args)).
Использование макросов – самый дешевый способ засунуть имя модуля в лог-мессадж. AFAIK сбор стектрейса в BEAM не является такой уж дешевой операцией, чтобы производить ее на каждом лог-мессадже.

От: begemot_sun <logu...@gmail.com>
Обратный адрес: <erlang-...@googlegroups.com>
Дата: Thursday 10 July 2014 10:13
Кому: <erlang-...@googlegroups.com>
Тема: Lager должен писать откуда вызвана функция логирования.
--
Вы получили это сообщение, поскольку подписаны на группу "Erlang по-русски".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес erlang-russia...@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес erlang-...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Message has been deleted

Dmitry Belyaev

unread,
Jul 10, 2014, 4:58:01 AM7/10/14
to erlang-...@googlegroups.com, begemot_sun
Самым простым решением будет, как уже сказали макрос. Другой вариант - parse_transform - делать в точности то же, что делает сам лагер в своем lager_transform.

Можно конечно извратиться - бросить исключение, поймать и взять стектрейс, но это плохо для производительности и вообще очень некрасиво.

Настоятельно рекомендую либо макрос, либо звать лагер напрямую.
--
Best wishes,
Dmitry Belyaev

Максим Давиденко

unread,
Jul 11, 2014, 8:33:37 AM7/11/14
to erlang-...@googlegroups.com
Поддерживаю идею с parse_transform, ребята из basho советуют использовать именно этот метод

четверг, 10 июля 2014 г., 11:13:46 UTC+4 пользователь begemot_sun написал:
Reply all
Reply to author
Forward
0 new messages