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

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

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

0 ответов

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

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

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

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

}

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

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

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

Другие вопросы по тегам