【问题标题】:Designing a (recursive) log object for an event logging system为事件日志系统设计(递归)日志对象
【发布时间】:2011-01-17 11:51:49
【问题描述】:

我正在设计一个应该存储事件的系统。每个事件都有三个基本属性:
1.时间戳(64位)
2. 钥匙(它是什么)。
3. value(事件的实际值)。

事件键通常是字符串,事件值几乎总是数字。

到目前为止很简单,但是这里有点混乱。事件系统应该允许向下钻取到非常高的级别。这意味着什么最好用一个例子来说明:

注意:为简洁起见,省略了时间戳。

key: hits // 可能是每小时,也可能是最后一秒,key 是特定于应用程序的,由用户决定他的应用程序多久向我们报告此事件。 价值:12000 // 钻取从这里开始。 关键:美国 价值:5000 键:State1 价值:2000 键:City1 价值:500 关键:英国 价值:5000 键:StateN 价值:20 // 到任意级别。

因此,正如您在上面看到的,该值实际上变成了一棵树。 有人可能会说,为什么不独立存储每个 k/v 并维护一个“父键”,由于写入增加(最终,当查找事件时,读取负载),这将是低效的。在一次操作中将它们写出并一次读回整个对象会更有效。

我想知道如何最好地设计这个。这些对象本质上是一个 C++ 类(尽管为了互操作性,它实际上是一个序列化框架 ala protocol buffers/thrift)。

事件系统与应用程序无关,但我想要一个很好的 API 来为客户端提供直观的。

你以前设计过这样的东西吗?想法?您认为最好的方法是什么?

提前谢谢你。

P.S:预计每天会有几百万个事件,我们将根据数据构建图表。

【问题讨论】:

    标签: c++ oop logging graphing


    【解决方案1】:

    能否扩展日志文件定义以提供“组”或“包”类型的日志标记?

    例如:

    组:美国密钥: 状态1
    价值:7000
    键:State2
    值:65191

    组:英国 ...

    这样您就可以解决每个组的解析问题...如果您正在寻找...

    【讨论】:

    • 从技术上讲,State1 和 US 之间没有区别(除了层次结构),因此,在这种情况下,我们必须为每个深度提供一个组,这很烦人,而且在在某些情况下,毫无意义。
    【解决方案2】:

    想到的一个想法是为您的条目提供第四个属性:父日志条目 ID。使用像 ActiveRecord 这样的 ORM,您可以形成一棵自然树。例如:

    class LogEntry < ActiveRecord::Base
        has_one :parent_log_entry
        has_many :log_entries
    end
    

    (这肯定是不正确的,但你会明白的)。

    ActiveRecord 方案有各种不同语言的各种实现,所以这与语言(和 DB)无关。

    【讨论】:

    • 这不会受到我在问题中提到的父 ID 实现的写入性能/读取性能问题的影响吗?
    • 我不明白您将如何进行“附加写入”...我的意思是,您可以为一行创建嵌套格式,例如 ['key1':'value1' [ 'subkey1':'subvalue1', 'subkey2':'subvalue2']] 会短一点,但是只有几个字节。如果您使用数据库作为日志存储,我的建议将很自然且易于实施,但如果您使用基于文件的方法当然更难。
    猜你喜欢
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 2014-04-22
    相关资源
    最近更新 更多