Сохранение структурированных журналов в RavenDB

Я пишу приложение .NET Core и хотел бы использовать структурированное ведение журналов, доступное в расширениях ведения журналов .NET Core, для более структурированного ведения журналов. Я хочу сохранить свои журналы в RavenDB, и мне интересно, есть ли какие-либо рекомендации для такого случая использования? Я новичок в Document DB, и я не могу предсказывать будущее, как я привык в реляционных базах данных SQL. Мои основные соображения:

  1. Должен ли я сохранять каждый журнал в отдельных документах или, может быть, лучше создать один документ для каждого структурированного шаблона журнала и сохранить журналы с одним и тем же шаблоном внутри. Вторая идея заманчива, но я мало беспокоюсь, что через какое-то время она взорвется?
  2. Было бы лучше сохранять все журналы в одном формате (сообщение, исключение и т.д.) и структурировать данные в прикрепленном к нему списке значений ключа или, может быть, было бы лучше создать отдельную структуру документа для каждого типа журнала?

person dnf    schedule 30.08.2019    source источник


Ответы (2)


Я думаю, что каждая запись журнала должна быть помещена в отдельный документ по следующим причинам:

  • Записи в журнале должны истечь, иначе база данных будет работать слишком долго. Если у вас есть несколько записей журнала в одном и том же документе, срок действия журнала не может быть истечен, вам необходимо удалить группу журналов в одном документе.
  • RavenDB не любит большие документы, потому что они вызывают проблемы с производительностью. Группировка журналов в одни и те же документы по шаблону приведет к созданию огромных документов.
  • Группировка документов затруднит получение набора коррелированных журналов.

Я думаю, что структурированные данные должны иметь классическую форму свойств JSON. Например:

{
   "State": {
        "Service": "International Weather Forecast Service",
        "{OriginalFormat}": "Weather forecast called using {Service}"
    }

}

На GitHub есть проект, использующий подход группировки RavenDB.StructuredLog. Но я думаю, что это не тот вариант, поэтому я создал свой: Logging.Raven

person Jesús López    schedule 25.03.2020
comment
Я тоже создал свой и делюсь вашими выводами - person dnf; 25.03.2020
comment
@dnf Это то, что я вижу? Возможно, вы делаете что-то, что я упустил из виду. - person Jesús López; 25.03.2020
comment
Ничего особенного - я решил использовать структурированное ведение журнала serilog и некоторый код для своих нужд (github.com/bigdnf/HomeCenter/tree/MotionService/Core/), но работа продолжается :) - person dnf; 25.03.2020

Что вы можете сделать, так это использовать модель, подобную этой:

public class LogMessage<T>
{
    public string Message;
    public string Exception;

    public T Value;
}

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

Также я думаю, что функция Срок действия документа будет полезна для удаления старых документов журнала. https://ravendb.net/docs/article-page/4.2/Csharp/server/extensions/expiration

person garay    schedule 03.09.2019