metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-08-28 02:31 pm

Странное

А вот почему ни в одном имеющемся под руками языке программирования нет функции "компилятор сам подставляет в вызов логгера имя функции, из которой его вызвали"?
Я понимаю, в log4net я могу подключить вывод фреймов стека, прямо в конфиге, но они достаточно знатно все тормозят в рантайме, а так бы на этапе компиляции подставлять имена функций в виде строковых констант.
В препроцессорах C и C++ есть __LINE__ и __FILE__, а больше я ничего подходящего вроде и не видел.

[identity profile] redplait.blogspot.com (from livejournal.com) 2012-08-28 11:35 am (UTC)(link)
functions inlining ?

[identity profile] http://users.livejournal.com/_slw/ 2012-08-28 11:38 am (UTC)(link)
/usr/src/contrib/binutils/bfd/bfd-in2.h: (warn_deprecated ("bfd_read", __FILE__, __LINE__, __FUNCTION__), \

[identity profile] justy-tylor.livejournal.com 2012-08-28 11:38 am (UTC)(link)
Бывает __func__, __FUNC__, __FUNCTION__, ...

В зависимости от компилятора.

[identity profile] falcrum.livejournal.com 2012-08-28 11:39 am (UTC)(link)
Уже задавался таким вопросом - было бы неплохо, да...

[identity profile] enternet.livejournal.com 2012-08-28 11:40 am (UTC)(link)
Да не надо это никому. Вот и весь секрет. Кому надо, тот и стек раскрутит и в лог запишет то, что захочет.

Уж на что в дотнете это просто делается, да и то бывает лениво. Последнее время компилирую всё с отладочной информацией, консольный вывод перенаправляю в файл. Вот и лог нахаляву.

[identity profile] potan.livejournal.com 2012-08-28 11:41 am (UTC)(link)
В Erlang и OCaml аналогичные фичи точно есть.

[identity profile] avnik.livejournal.com 2012-08-28 11:42 am (UTC)(link)
В питоне можно так сделать.
Стандартный logging не умеет, но http://packages.python.org/Logbook/ вроде бы умеет

(Anonymous) 2012-08-28 11:42 am (UTC)(link)
опана что я нашел:
http://msdn.microsoft.com/en-us/library/hh534540.aspx

[identity profile] volodymir-k.livejournal.com 2012-08-28 11:48 am (UTC)(link)
целую языковую фичу вводить ради одного, неочевидно нужного ли, применения?

если приспичит экономить полпроцента "тормозов", ну сделайте свой препроцессор

[identity profile] plumqqz.livejournal.com 2012-08-28 11:53 am (UTC)(link)
perldoc -f caller

[identity profile] bambr77.livejournal.com 2012-08-28 12:04 pm (UTC)(link)
Это типа так:

if {$debugMode == 1} {puts [info level 0]}
Edited 2012-08-28 12:04 (UTC)

[identity profile] jakobz.livejournal.com 2012-08-28 12:13 pm (UTC)(link)
Только это должно быть не в языке, а в средствах интроспекции. Что-то типа
var caller = currentThread.Reflection.GetStack().GetItem(1);
log(caller.FunctionName + " " + caller.LineNumber);

[identity profile] vit-r.livejournal.com 2012-08-28 12:48 pm (UTC)(link)
Perl caller

Но я это использую только в одном месте: специально написанные функции типа warn и assert в модуле диагностики.

[identity profile] zelanton.livejournal.com 2012-08-28 01:27 pm (UTC)(link)
напиши уже парсер исходников, который будет расставлять соотв. константы.
Edited 2012-08-28 13:42 (UTC)

[identity profile] familom.livejournal.com 2012-08-28 01:56 pm (UTC)(link)
http://www.gnu.org/savannah-checkouts/non-gnu/libunwind/man/libunwind%283%29.html

[identity profile] migmit.livejournal.com 2012-08-28 02:48 pm (UTC)(link)
А в чём проблема использовать CPP с другими языками?

[identity profile] vaddimka.livejournal.com 2012-08-28 03:42 pm (UTC)(link)
__FUNCTION__ же
что в студии, что в gcc
для log4cxx элементарно делается дефайн который сам вставляет имя функции

[identity profile] max_posedon (from livejournal.com) 2012-08-28 06:39 pm (UTC)(link)
Фрагмент моей любимой библиотеки для логирования.

#define sd_journal_print(priority, ...) sd_journal_print_with_location(priority, "CODE_FILE=" __FILE__, "CODE_LINE=" _sd_STRINGIFY(__LINE__), __func__, __VA_ARGS__)

А ещё она сама добавляет: PID, UID, GID, CMDLINE, REALTIME_TIMESTAMP, MONOTONIC_TIMESTAMP, HOSTNAME и некоторые другие, менее важные параметры.