Регистрация в Delphi с несколькими приемниками и отложенной классификацией? - PullRequest
3 голосов
/ 03 октября 2011

Представьте, что я хочу проанализировать двоичный блок данных.Если все идет хорошо, тогда все журналы являются INFO, и пользователь по умолчанию даже не видит их.Если есть ошибка, то пользователю представляется ошибка, и он может просмотреть журнал, чтобы увидеть точную причину (мне не нравятся программы, которые просто говорят «файл инвазирован. По какой-то причине. Вы не хотите это знать»)

Вероятно, большинство библиотек журналов нацелены на быструю загрузку, классификацию и хранение множества строк журнала в секунду., что само по себе сомнительно, поскольку в Delphi нет ленивых вычислений и закрытий.Зависть Scala: -)

Однако необходимо предварительно классифицировать каждую строку.

Представьте себе этот гипотетический поток:

    1. Получил объект FOO [ок]
      • 1.1.найдено имущество BAR [ok]
        • 1.1.1.проанализированы данные для BAR [ok]
      • 1.2 найдено свойство BAZ [ok]
        • 1.2.1 успешно проанализированы данные для BAR [ok]
        • 1.2.2 сопоставление данных: проверена зависимость между BAR и BAZ [сбой] ...

Итак, что можно пожелатьОсобенности?

1) Желательно, чтобы вложенные записи (отступ, подчинение).Нечто подобное выделено в TraceTool - см. TraceNode.Send Method at http://www.codeproject.com/KB/trace/tracetool.aspx#premain0

2) Строки 1, 1.1, 1.1.1, 1.2, 1.2.1 отправляются так, как они происходят вприемник информации (TMemo, OutputDebugString, EventLog и т. д.), поэтому пользователь может видеть и сообщать, по крайней мере, какие шаги выполнены до ошибки.

3) 1, 1.2, 1.2.2 задним числом помечены как ошибка (или предупреждение, или что угодно) наследование от наиболее конкретной строки.Очевидно, что предупреждение заменяет информацию об ошибках, предупреждение об ошибках и информацию, и т. Д. /

4) 1 + 1.2 + 1.2.2 можно легко комбинировать, как с LogMessage ('1.2.2'). FullText чтобы показать пользователю или преобразовать в Исключение, чтобы донести всю историю до человека.

4.1) Опционально, при соответствующей настройке, оно будет не только преобразовано в Исключение, но последнее даже будет автоматическиподнял.Это, вероятно, потребовало бы некоторого контекста с предоставленным классом исключений или предоставленным исключением, создающим обратный вызов.

5) Multisink: информация может быть просто добавлена ​​в сворачиваемую панель с TMemo в основной или текущей активной форме.Состояние ошибки может открыть такую ​​панель дополнительно или предложить пользователю сделать это.В то же время некоторые файловые или сетевые серверы могут, например, получать сообщения с предупреждениями и оценками ошибок и не получать сообщения с оценками информации.

6) также могут быть полезны дополнительные связанные данные.Скажем, если визуализировать его с помощью TreeView, а не TMemo, то он может иметь элемент «1.1.1. Проанализированные данные для BAR [ok]» с подсказкой мыши, например «Размеры Foo равны 2x4x3.2 метра»

  • Быть свободной библиотекой приятно, особенно бесплатно с исходниками.Иногда отследить и исправить ошибку, полагаясь исключительно на DCU, гораздо сложнее.
  • Не требует дополнительного исполняемого файла.он мог бы предложить более продвинутый просмотрщик, но не должен требоваться только для какой-либо функциональности.
  • Не быть застопорившимся / заброшенным.
  • способность работать и показывать хоть что-то до инициализации GUI будеттоже неплохо.Конструкторы классов хороши, но выполняются как часть визуализации модуля, когда VCL еще не загружен.Если оттуда выдается какое-либо утверждение / исключение, пользователь увидит только ошибку 217 во время выполнения со всеми потерянными деталями.По крайней мере, можно использовать OutputDebugStreen, если ничего более ...

Трассировка стека не требуется, при необходимости я могу это сделать и добавить с помощью Jedi CodeLib.Но это редко требуется.

Внешняя настройка не требуется.Для большого приложения было бы хорошо перенастроить на лету, но для меня простота гораздо важнее, и конфигурация в коде, с помощью вызова конструкторов или чего-то еще, это то, что действительно имеет значение.Дополнительный файл XML, как и для Log4J, только сделает вещи более хрупкими и сложными.

Я посмотрел несколько упомянутых здесь библиотек.

  • TraceTool имеет отличную презентацию, ссылка выше. Тем не менее, он не имеет информационной оценки, только 3 предопределенных оценки (отладка / ошибка / предупреждение) и ничего более, но, возможно, отладка подойдет для замены информации ... Похоже, черный ящик, только сохранение данных в свой файл и с использованием внешнего инструмента чтобы просмотреть его, не возвращая мне поток событий. Но их вложение сообщений и цепочка вызовов кажутся крутыми. Cools также прикрепляет объекты / коллекции к сообщениям.
  • Log4D и Log4Delphi, похоже, находятся в стазисе, с последними выпусками 2007 и 2009 годов, последней целевой версией Delphi 7. Отсутствие документации (вероятно, хорошо для парня log4j, но не для меня: -) Log4Delphi даже имел тестовую папку - но эти тесты не компилируются в Delphi XE2-Upd1. Жаль: в другой теме здесь Log4delphi приветствовали за то, как просто создать пользовательский журнал appender (сток) ...
    • Кстати, тот факт, что единственный LOG4J был разветвлен в два независимых порта Delphi, оставляет вопрос о том, что лучше, и что у обоих чего-то не хватает, если они должны были оставаться в сплите.
  • Часть mORMot едва ли отделена от остальной библиотеки. Демонстрационное приложение требовало повышения UAC для использования встроенного движка SQLite3 и зависало (окно не открывалось, но процесс никогда не завершался нормально), если было отказано в предоставлении прав администратора. Другая демонстрация только что начала бесконечный поток исключений AV, пытаясь размотать стек. Так что, вероятно, еще не готов к последней Delphi. Хотя его список оценок сообщений является чрезмерным, может быть, даже слишком много.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 03 октября 2011

MORMot стабильно работает даже с последней версией XE2 Delphi.

То, что вы пытались начать, были регрессионные тесты. Среди 6000000 тестов он включает в себя клиент-серверную часть HTTP / 1.1 ORM. Без прав администратора сервер http.sys не может зарегистрировать URI, поэтому вы получили ошибки. Что имеет смысл. Это ограничение Vista / Seven, а не ограничение MORMot.

Каротажная часть может использоваться полностью отделенной от ORM части . Ведение журнала реализовано в SynCommons.pasSynLZ.pas для алгоритма быстрого сжатия, используемого для архивирования и встраивания .map). Я использую класс TSynLog без каких-либо проблем для регистрации существующих приложений (даже приложений Delphi 5 и Delphi 6), существующих годами. Классы SQLite3 / ORM реализованы в других модулях.

Он поддерживает вложение событий с функцией автоматического выхода, как вы ожидаете. То есть вы можете написать:

procedure TMyClass.MyMethod(const Params: integer);
begin
  TSynLog.Enter;
  // .... my method code
end;

И добавление этого TSynLog.Enter будет записано с отступом, соответствующим рекурсивному уровню. ИМХО это может соответствовать вашим требованиям. Он объявит интерфейс ISynLog в стеке, который будет освобожден Delphi в строке кода "end;", поэтому он реализует функцию Auto-Leave . И точное имя модуля, имя метода и номер строки исходного кода будут записаны в журнал (как MyUnit.TMyClass.MyMethod (123)), если вы сгенерировали файл .map при компиляции (который может быть сжат и добавлен в .exe, чтобы ваши клиенты журналы будут содержать номера строк источника). У вас есть методы на уровне интерфейса ISynLog для добавления некоторых пользовательских журналов, включая параметры и пользовательское состояние (вы можете записывать свойства объектов как JSON, если вам нужно, или записывать свои собственные данные журналов).

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

Если вы считаете, что журналы слишком многословны, у вас есть несколько уровней ведения журнала, которые можно настроить на стороне клиента. См. статьи блога и соответствующую часть документации инфраструктуры (в части SynCommons ). Например, у вас есть события «Fail» и некоторые другие виды событий. И он полностью независим от VCL, поэтому вы можете использовать его без графического интерфейса или до запуска любого графического интерфейса.

У вас под рукой есть средство просмотра журналов, которое разрешает профилирование на стороне клиента и вложенное представление Enter / Leave (если вы щелкнете по строке «Leave», вы вернетесь к соответствующему «Enter», например):

Log Viewer

Если этого средства просмотра журнала недостаточно, у вас есть его исходный код, чтобы он соответствовал вашим требованиям, и все необходимые классы для самостоятельного анализа и обработки файла .log, если хотите. Журналы по умолчанию являются текстовыми, но могут быть сжаты в двоичный файл по запросу для экономии места на диске (программа просмотра журналов может читать эти сжатые двоичные файлы). Отслеживание стека и перехват исключений реализованы и могут быть активированы по запросу.

Вы можете легко добавить нумерацию типа «1.2.1» в журналы, если хотите. У вас есть весь исходный код блока регистрации. Не стесняйтесь задавать любые вопросы на нашем форуме .

0 голосов
/ 03 октября 2011

Log4D поддерживает вложенные диагностические контексты в классе TLogNDC , их можно использовать для группировки всех шагов, связанных с одним составным действием (вместо группировки на основе сеанса)журнала событий).Multi-Sinks называются Appenders в log4d и log4delphi, поэтому вы можете написать TLogMemoAppender с примерно двадцатью пятью строками кода и использовать его одновременно как ODSAppender, RollingFileAppender или SocketAppender, настраиваемый во время выполнения (без внешнего файла конфигурациитребуется).

...