Назрел еще вопросик, на этот раз по логу, хоть он в зкаде и странный, но иногда выручает))
Чуток предистории:
Сначала у меня был простой лог, например:
Код: Выделить всё
programlog.LogOutFormatStr('AddEntitiesFromDXF found primitive %s',[s]);
в лог сыпется куча всего и мне захотелось отступов в лог файле, для удобства чтения, и у процедуры записи в лог появился параметр управляющий отступом последующих строк, стало примерно так:
Код: Выделить всё
//начало какойто процедуры
programlog.LogOutStr('Start AddEntitiesFromDXF',lp_IncPos);
...
programlog.LogOutFormatStr('AddEntitiesFromDXF found primitive %s',[s],lp_OldPos);
...
//конец этой процедуры
programlog.LogOutStr('End AddEntitiesFromDXF',lp_DecPos);
соответственно
lp_IncPos - увеличить отступ
lp_OldPos - не изменять отступ
lp_DecPos - уменьшить отступ
В лог сыплется по прежнему много, но уже покрасивее))
Тогда мне захотелось поуправлять уровнем логирования, чтобы из командной строки управлять объемом лога. Гдето в интернете подглядел как грамотеи разделяют уровень в логах и у меня получилось примерно так:
Код: Выделить всё
TLogMode=(
LM_Trace, // — вывод всего подряд. На тот случай, если Debug не позволяет локализовать ошибку.
LM_Debug, // — журналирование моментов вызова «крупных» операций.
LM_Info, // — разовые операции, которые повторяются крайне редко, но не регулярно. (загрузка конфига, плагина, запуск бэкапа)
LM_Warning,// — неожиданные параметры вызова, странный формат запроса, использование дефолтных значений в замен не корректных. Вообще все, что может свидетельствовать о не штатном использовании.
LM_Error, // — повод для внимания. Тут интересно окружение конкретного места ошибки.
LM_Fatal, // — тут и так понятно. Выводим все до чего дотянуться можем, так как дальше приложение работать не будет.
LM_Necessarily // — Вывод в любом случае
);
По умолчанию объем лога выставлен на уровне LM_Error, сообщения приходящие с уровнем выше в лог записаны небудут, регулировать это можно соответствующими параметрами командной строки. Соответственно вывод в лог теперь выглядит так:
Код: Выделить всё
//начало какойто процедуры
programlog.LogOutStr('Start AddEntitiesFromDXF',lp_IncPos,LM_Debug);
...
programlog.LogOutFormatStr('AddEntitiesFromDXF found primitive %s',[s],lp_OldPos,LM_Trace);
...
//конец этой процедуры
programlog.LogOutStr('End AddEntitiesFromDXF',lp_DecPos,LM_Debug);
Т.е. у меня для лога кроме собственно сообщения имеется 2 параметра - "отступ" и "важность", и отказываться от них неохота - удобно.
Сейчас в связи с борьбой с внутренними зависимостями в программе появились места в которых хорошо бы убрать использование зкадного лога и использовать LCLный DebugLn (благо всё что туда шлется можно перехватить).
И собственно вопрос как можно юзая DebugLn не потерять возможность отступов и важности?
Первое что пришло в голову - когда надо добавлять к сообщениям соответствующие префиксы:
Код: Выделить всё
//начало какойто процедуры
DebugLn('{MD+}Start AddEntitiesFromDXF');//'MD'=LM_Debug, '+' - увеличение отступа
...
DebugLn(format(AddEntitiesFromDXF found primitive %s',[s]));//сообщения без префикса считаем LM_Trace без изменения отступа
...
//конец этой процедуры
DebugLn('{MD-}End AddEntitiesFromDXF');//'MD'=LM_Debug, '-' - уменьшение отступа
В обработчике onDebugLn на основе их восстанавливать отступ и важность и скармливать подрезаные сообщения зкадному логу. Есть какиенибудь системы логирования работающие по этому принципу?