Реализация библиотеки журналов в .NET с базой данных в качестве носителя данных - PullRequest
3 голосов
/ 10 мая 2010

Я только начинаю работать над библиотекой журналов, которую каждый может использовать для отслеживания любой системной информации, пока пользователь запускает наше приложение. Простейший пример на данный момент - это отслеживание информации, предупреждений и ошибок.

Я хочу, чтобы все плагины могли использовать эту функцию, но, поскольку у каждого разработчика может быть свое представление о том, что важно сообщать, я хочу сделать это как можно более универсальным.

В мире C ++ я обычно использовал бы что-то вроде stl::pair<string,string>, чтобы действовать как структура пары ключ-значение, и имел бы stl::list из них, чтобы действовать как "строка" в журнале. Тогда кеш журнала будет list<list<pair<string,string>>> (тьфу!). Таким образом, разработчики могут использовать строковый ключ const, такой как INFO, WARNING, ERROR, для согласованного именования столбца в базе данных (для выбора определенных типов информации).

Я бы хотел, чтобы база данных могла иметь дело с любым количеством различных имен столбцов. Например, у Джона может быть строка INFO со столбцом с именем USER, а у Билла может быть строка INFO со столбцом с именем FILENAME. Я хочу, чтобы средство просмотра журнала могло отображать всю информацию, и если в одном отчете нет значения INFO / FILENAME, эти поля должны просто отображаться пустыми. Таким образом, одним из вариантов является использование List<List<KeyValuePair<String,String>>>, а другим - заставить потребителя библиотеки журналов каким-либо образом «зарегистрировать» свою схему, а затем заставить базу данных выполнить ALTER TABLE для обработки этой ситуации. Еще одна идея состоит в том, чтобы иметь таблицу, предназначенную только для пар «ключ-значение», с внешним ключом, который отображает пары «ключ-значение» обратно в исходную запись журнала.

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

Мои конкретные вопросы по этому поводу:

  1. Видите ли вы проблемы с производительностью? Другими словами, вы когда-нибудь пробовали что-то подобное и обнаружили, что некоторые вещи просто не работают на практике?
  2. Существует ли более .NETish способ реализации пар ключ-значение, кроме List<List<KeyValuePair<String,String>>>?
  3. Даже если есть способ сделать №2 лучше, идея ALTER TABLE, которую я предложил выше плохой вещи?
  4. Вы бы порекомендовали несколько баз данных по одной? У меня пока нет представления о том, как часто будет записываться журнал, но в идеале нам хотелось бы иметь много информации низкого уровня. Возможно, должна быть БД с фиксированной схемой только для вещей низкого уровня, а затем еще одна БД, более гибкая для предоставления информации пользователям.

Ответы [ 3 ]

10 голосов
/ 10 мая 2010

почему бы вам не проверить log4net ? Это может быть достаточно для ваших целей, и вы бы не изобретали колесо, которое уже много раз изобретали: -)

Здесь у вас есть несколько примеров конфигурации о том, как хранить информацию журнала в базе данных:

http://logging.apache.org/log4net/release/config-examples.html

4 голосов
/ 10 мая 2010

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

Вот список некоторых распространенных библиотек журналов:

А если у вас возникли проблемы с выбором, используйте фасад регистрации, чтобы скрыть реализацию. Для этого вы можете выбрать:

1 голос
/ 10 мая 2010
  1. Нет, пока их не будет (Кнут).
  2. Создание моделей, которые фактически моделируют ваши записи в журнале, а затем кэшируют их в список
  3. Я бы предоставил стандартные поля и сохранил все настраиваемые пользователем данные в формате XML. Обеспечивает гибкую систему ведения журналов, не приводит к изменениям схемы и позволяет выполнять поиск (по крайней мере, в Sql Server).
  4. Больше баз данных - больше обслуживания. Будь проще. На самом деле, просто используйте Log4net.
...