gpt4 book ai didi

go - 在 golang 中制作日志文件

转载 作者:IT王子 更新时间:2023-10-29 01:53:17 25 4
gpt4 key购买 nike

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

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

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

在自定义代码中实现此类文件是否有任何“最佳实践”,例如关于文件结构、填充和锁定?在 Go 中这样做是否有任何顾虑,因为它是跨平台的,而不是使用 native 文件系统 API?

最佳答案

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

逻辑应该很简单:

  1. 接收消息

  2. 写到日记

  3. 现在可选择对日志执行 fsync - 取决于您的一致性要求。

  4. 然后可选择发送“已收到确认”- 取决于您的需要。

  5. 处理消息。

  6. 可选择将另一条“已处理”记录写入文件,并使用该记录的 ID。您并不总是需要它,但是在您不重写旧记录的地方。或者,您可以使用已处理的“顶级交易 ID”编写一个单独的文件,这样您将自动知道在失败的情况下从哪里开始再次处理。这将减少日志大小。

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

数据库通常让您控制 fsync 行为 - 每次写入,每 N 秒,当操作系统决定时 - 这是速度与耐用性的问题。

关于这个主题的一个很好的阅读可能是这篇关于 redis 持久性的帖子: http://oldblog.antirez.com/post/redis-persistence-demystified.html

[编辑] 关于该主题的另一本精彩读物 - http://engineering.linkedin.com/distributed-systems/log-what-every-software-engineer-should-know-about-real-time-datas-unifying

至于它的 Go 方面 - 有几个写入文件的选项,从低级文件处理程序到缓冲写入器。当然,文件处理程序将使您能够最大程度地控制幕后发生的事情。我不确定 Go 中的普通文件编写器在幕后做了多少缓存,如果你打算使用它,我建议你阅读代码。

关于go - 在 golang 中制作日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23534691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com