Представьте, что я хочу проанализировать двоичный блок данных.Если все идет хорошо, тогда все журналы являются INFO, и пользователь по умолчанию даже не видит их.Если есть ошибка, то пользователю представляется ошибка, и он может просмотреть журнал, чтобы увидеть точную причину (мне не нравятся программы, которые просто говорят «файл инвазирован. По какой-то причине. Вы не хотите это знать»)
Вероятно, большинство библиотек журналов нацелены на быструю загрузку, классификацию и хранение множества строк журнала в секунду., что само по себе сомнительно, поскольку в Delphi нет ленивых вычислений и закрытий.Зависть Scala: -)
Однако необходимо предварительно классифицировать каждую строку.
Представьте себе этот гипотетический поток:
- Получил объект 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. Хотя его список оценок сообщений является чрезмерным, может быть, даже слишком много.
Спасибо.