Go 在戈兰制作日志文件
我在Go中有一个小项目,它通过tcp接收文本行进行处理。但是,为了确保稳健性,我想创建某种日志,以便在断电时不会丢失任何东西(例如,我的应用程序接收到一帧数据,但尚未处理) 我在谷歌上搜索过关于如何实现日志文件的指南,但搜索结果被Oracle RDBMS文档等严重污染 我的想法是:在收到一行代码后,立即将其写入带有“未处理标志”的文件中。处理后,更新文件,以清除此标志,打开覆盖。清除此标志的同时,向数据发送方发送“已处理的确认”。也许在日志中处理固定大小的“插槽”是最容易的,以确保我可以重用已释放的插槽,而不是拥有不断增加的文件,并维护未使用插槽的“空闲列表”Go 在戈兰制作日志文件,go,journal,Go,Journal,我在Go中有一个小项目,它通过tcp接收文本行进行处理。但是,为了确保稳健性,我想创建某种日志,以便在断电时不会丢失任何东西(例如,我的应用程序接收到一帧数据,但尚未处理) 我在谷歌上搜索过关于如何实现日志文件的指南,但搜索结果被Oracle RDBMS文档等严重污染 我的想法是:在收到一行代码后,立即将其写入带有“未处理标志”的文件中。处理后,更新文件,以清除此标志,打开覆盖。清除此标志的同时,向数据发送方发送“已处理的确认”。也许在日志中处理固定大小的“插槽”是最容易的,以确保我可以重用已释
在自定义代码中实现这些文件是否有“最佳实践”,例如关于文件结构、填充和锁定?在Go中这样做有什么问题吗?因为它是跨平台的,而不是使用本机文件系统API?您不应该重写日志。只需将操作附加到它,以便可以重新创建它们,然后控制所需的严格级别 逻辑应该是:
至于Go方面,有一些写入文件的选项,从低级文件处理程序到缓冲写入程序。当然,文件处理程序将使您能够最有效地控制引擎盖下发生的事情。我不确定Go中普通文件编写器的后台缓存量有多大,如果您打算使用它,我建议您阅读代码。但只有附加操作最终会填满磁盘,因此,我发现需要一些旋转功能,即归档文件并创建另一个文件,以便删除前一个文件?@invitus是的,当然-例如,mysql旋转日志文件,您可以配置旋转的大小。然后可以使用logrotate来废弃旧文件。这取决于您是否需要它来重新创建延迟事务,或者是否能够像redis那样重新创建整个事务日志。关于您需要多少一致性,在错误情况下是否可以处理消息两次,等等,有很多细节会影响这种情况下的最佳日志设计。如果没有更多的细节,就很难提供有用的答案。
os
软件包提供了跨平台的sync
和rename
调用,这应该足以实现大多数类型的日志。