Сохранение структурированных логов в RavenDB
Я пишу приложение.NET Core и хотел бы использовать структурированное ведение журналов, доступное в расширениях.NET Core Logging, для записи журналов более структурированным способом. Я хочу сохранить свои журналы в RavenDB, и мне интересно, есть ли лучшие практики для такого варианта использования, как этот? Я новичок в Document DB и не могу предсказать вещи в будущем, как я привык в реляционных базах данных SQL. Мое главное соображение:
- Должен ли я сохранять каждый журнал в отдельных документах или, может быть, лучше создать один документ для каждого шаблона структурированного журнала и сохранить внутри него один и тот же шаблон. Вторая идея заманчива, но я немного волнуюсь, что она взорвется через некоторое время?
- Было бы лучше сохранить все журналы в одном формате (сообщение, исключение и т. Д.) И структурированные данные в прикрепленном к нему списке значений ключей или, может быть, лучше создать отдельную структуру документа для каждого типа журнала?
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