【发布时间】:2010-04-17 12:41:39
【问题描述】:
我有一个服务,它一直在运行并且还保留一个日志文件。它基本上每隔几秒就会在日志文件中添加新行。我写了一个小文件,它读取这些行,然后将它们解析为各种动作。我的问题是如何在不中断服务写入日志文件的情况下删除我已经从日志文件中解析的行?
通常当我需要删除文件中的一行时,我会打开原始行和临时行,然后将所有行写入临时文件,但要删除的原始行除外。显然这个方法在这里就不说了。
那么我该如何删除它们呢?
【问题讨论】:
我有一个服务,它一直在运行并且还保留一个日志文件。它基本上每隔几秒就会在日志文件中添加新行。我写了一个小文件,它读取这些行,然后将它们解析为各种动作。我的问题是如何在不中断服务写入日志文件的情况下删除我已经从日志文件中解析的行?
通常当我需要删除文件中的一行时,我会打开原始行和临时行,然后将所有行写入临时文件,但要删除的原始行除外。显然这个方法在这里就不说了。
那么我该如何删除它们呢?
【问题讨论】:
在最常用的文件系统中,您不能在不重写整个文件的情况下从文件开头删除一行。我建议不要使用一个大文件,而是使用大量小文件,例如每天轮换一次。当您不再需要旧文件时,它们将被删除。
【讨论】:
很遗憾,如果不重写文件,无论是就地或作为单独的文件,都无法完成。
您可能想查看的一件事是在另一个文件中维护一个指针,指定第一个未处理行的位置。
然后您的进程只需打开文件并寻找该位置,处理一些行,然后更新指针。
您仍然需要在某些时候滚动文件,以免它们继续永远增长。
【讨论】:
我不确定,但我是这样想的: 新行是一个字符,因此您必须删除该行的字符 + 新行字符 顺便说一句,将所有字符“移回”(覆盖旧行),就像将每个字符复制到不同的位置,然后将它们从旧位置移除
所以不,我认为你不能只删除一行,你应该重写所有文件。
【讨论】:
你不能,这不是文件的工作方式。
听起来您需要某种消息记录服务/库,您的程序可以连接到该服务/库来记录消息,然后可以隐藏文件打开/关闭等的底层细节。
【讨论】:
如果每个日志行都有一个唯一的标识符(或者甚至只是行号),您可以简单地将标识符存储在您的日志解析中,直到您进行解析。这样您就不必更改日志文件中的任何内容。
如果日志文件开始变得太大,您可以每天切换到一个新文件(例如)。
【讨论】: