在 RavenDB 中保存结构化日志

Saving structured logs in RavenDB

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

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

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

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

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

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

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

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

}

GitHub 上有一个项目遵循分组方法 RavenDB.StructuredLog. But I think it is not the right one, so I created mine: Logging.Raven