【问题标题】:Saving structured logs in RavenDB在 RavenDB 中保存结构化日志
【发布时间】:2019-08-30 10:09:28
【问题描述】:

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

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

【问题讨论】:

    标签: logging .net-core ravendb structured-logging


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我也创建了我的,我分享你的结论
    • @dnf 我能看到吗?也许你正在做我忽略的事情。
    • 没什么花哨的 - 我决定使用 serilog 结构化日志记录和一些代码来满足我的需要 (github.com/bigdnf/HomeCenter/tree/MotionService/Core/…),但工作正在进行中 :)
    【解决方案2】:

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

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

    将每条日志消息保存为集合中的单独文档。 如果您将来需要更改某些内容,您可以更改此模型并使用补丁功能来修补您的旧文档。

    我还认为 Document Expiration 功能对于删除旧的日志文档很有用。 https://ravendb.net/docs/article-page/4.2/Csharp/server/extensions/expiration

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2018-03-24
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多