Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 在戈兰制作日志文件_Go_Journal - Fatal编程技术网

Go 在戈兰制作日志文件

Go 在戈兰制作日志文件,go,journal,Go,Journal,我在Go中有一个小项目,它通过tcp接收文本行进行处理。但是,为了确保稳健性,我想创建某种日志,以便在断电时不会丢失任何东西(例如,我的应用程序接收到一帧数据,但尚未处理) 我在谷歌上搜索过关于如何实现日志文件的指南,但搜索结果被Oracle RDBMS文档等严重污染 我的想法是:在收到一行代码后,立即将其写入带有“未处理标志”的文件中。处理后,更新文件,以清除此标志,打开覆盖。清除此标志的同时,向数据发送方发送“已处理的确认”。也许在日志中处理固定大小的“插槽”是最容易的,以确保我可以重用已释

我在Go中有一个小项目,它通过tcp接收文本行进行处理。但是,为了确保稳健性,我想创建某种日志,以便在断电时不会丢失任何东西(例如,我的应用程序接收到一帧数据,但尚未处理)

我在谷歌上搜索过关于如何实现日志文件的指南,但搜索结果被Oracle RDBMS文档等严重污染

我的想法是:在收到一行代码后,立即将其写入带有“未处理标志”的文件中。处理后,更新文件,以清除此标志,打开覆盖。清除此标志的同时,向数据发送方发送“已处理的确认”。也许在日志中处理固定大小的“插槽”是最容易的,以确保我可以重用已释放的插槽,而不是拥有不断增加的文件,并维护未使用插槽的“空闲列表”


在自定义代码中实现这些文件是否有“最佳实践”,例如关于文件结构、填充和锁定?在Go中这样做有什么问题吗?因为它是跨平台的,而不是使用本机文件系统API?

您不应该重写日志。只需将操作附加到它,以便可以重新创建它们,然后控制所需的严格级别

逻辑应该是:

  • 接收消息

  • 把它写在日记本上

  • 根据您的一致性要求,现在可以选择在日志上执行fsync

  • 然后根据您的需要发送“收到的确认”

  • 处理消息

  • (可选)将另一条“已处理”记录写入具有记录id的文件。你并不总是需要它,但在这里你不需要重写旧的记录。或者,您可以使用已处理的“顶级事务id”编写一个单独的文件,以便在出现故障时自动知道从何处重新开始处理。这将减少日志大小

  • 发送“已处理确认”或“处理失败”-同样,取决于您想要什么

  • 数据库通常允许您控制fsync行为—每次写入,每N秒,由操作系统决定—这是速度与耐久性的问题

    这篇关于redis persistence的文章可能是关于这个主题的好读物:

    [编辑]关于这个主题的另一篇精彩读物-


    至于Go方面,有一些写入文件的选项,从低级文件处理程序到缓冲写入程序。当然,文件处理程序将使您能够最有效地控制引擎盖下发生的事情。我不确定Go中普通文件编写器的后台缓存量有多大,如果您打算使用它,我建议您阅读代码。

    但只有附加操作最终会填满磁盘,因此,我发现需要一些旋转功能,即归档文件并创建另一个文件,以便删除前一个文件?@invitus是的,当然-例如,mysql旋转日志文件,您可以配置旋转的大小。然后可以使用logrotate来废弃旧文件。这取决于您是否需要它来重新创建延迟事务,或者是否能够像redis那样重新创建整个事务日志。关于您需要多少一致性,在错误情况下是否可以处理消息两次,等等,有很多细节会影响这种情况下的最佳日志设计。如果没有更多的细节,就很难提供有用的答案。
    os
    软件包提供了跨平台的
    sync
    rename
    调用,这应该足以实现大多数类型的日志。