1

我正在编写 .NET Core 应用程序,并希望使用 .NET Core Logging Extensions 中提供的结构化日志记录以更结构化的方式编写日志。我想将我的日志保存在 RavenDB 中,我想知道这样的用例是否有最佳实践?我是 Document DB 的新手,我无法像以前在 SQL 关系数据库中那样预测未来的事情。我的主要考虑是:

  1. 我应该将每个日志保存在单独的文档中,还是更好的主意是为每个结构化日志模板创建一个文档,并在其中保存具有相同模板的日志。第二个想法很诱人,但我有点担心它会在一段时间后爆炸?
  2. 最好以一种格式(消息、异常等)保存所有日志并将结构化数据保存在附加的键值列表中,或者为每种日志类型创建单独的文档结构会更好?
4

2 回答 2

1

我认为每个日志条目都应该进入一个单独的文档,原因如下:

  • 日志条目应该过期,否则数据库将超时。如果同一个文档中有多个日志条目,则不能使一个日志过期,您需要使同一个文档中的一组日志过期。
  • RavenDB 不喜欢巨大的文档,因为它们会导致性能问题。通过模板将日志分组到相同的文档中会产生巨大的文档。
  • 对文档进行分组会使获取相关日志集变得更加困难。

我认为结构化数据应该采用经典的 JSON 属性形式。例如:

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

}

GitHub 上有一个遵循分组方法RavenDB.StructuredLog的项目。但我认为这不是正确的,所以我创建了我的:Logging.Raven

于 2020-03-25T19:51:05.313 回答
0

你可以做的是,使用类似于这样的模型:

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

于 2019-09-03T14:53:45.700 回答