2

我正在 vb.net 中编写一个简单的应用程序,并且需要将一些信息输出到日志文件以进行诊断。

为了确保日志文件不会变得太大,我需要将它修剪到一定数量的行(比如 5000)。出于性能原因,不必在每次写出日志条目时都进行修剪,也不必进行修剪(例如,如果应用程序过早崩溃)。

但是我不确定修剪它的最佳方法。将整个日志加载到内存中,然后仅重新写入最后 5000 行将起作用,但我确信有一种更清洁、更好的方法可以做到这一点。

任何人都可以建议一种更有效的方法吗?我在 vb.net 相当新,所以代码示例将不胜感激。

4

4 回答 4

4

与其担心修改我已经编写的数据,我只会遵循历史悠久的传统,即在某个时间点开始一个新的日志文件,无论是当当前日志文件达到一定大小时,还是按计划(每小时,每天或以其他方式)。

只需将当前日志文件从 重命名为xyzzy.logxxyyz-YYYYMMDDHHMMSS.log然后开始一个全新的xyzzy.log.

这也为您在维护日志的完整审计和保留磁盘空间之间提供了一个不错的权衡。您可以设置程序来删除超过 30 天的日志文件,或将聚合大小保持在某个阈值以下,甚至将较旧的日志集中到辅助存储区域。

这些过程甚至不必成为您程序的一部分 - 过去,我只是有一个清理旧日志文件的计划任务,该任务与程序本身不共享任何内容,除了脚本所在的目录居住。

这可能是没有集成第三方产品的最简单方法(这并不总是可能的),并且由于日志文件几乎总是为程序员而不是用户提供,因此命名标准不应该太繁琐.


我过去使用过的一个非常简单的解决方案(诚然与 Linux 一起使用)实际上根本不用担心重命名。只需让日志功能使用当前日期打开文件,并记住日期是什么。之后每次调用 log 函数时,检查日期是否已更改,如果已更改,请打开一个新的日志文件以进行后续记录。这使您每天只需花费很少的精力即可获得一个日志文件。

然后我只是有脚本find -mtime用来删除超过一定年龄的那些。

于 2010-10-29T12:03:15.280 回答
1

死线,我知道......但没有任何回应实际上回答了这个问题,只是关于他们为什么不这样做的建议。我知道在某些情况下,在日志中保留最后几行会派上用场。5,000 可能有点多,但我该判断谁。所以这是我的看法,以及我使用的东西。

dim LogPath as string = "YourLogPath"    
Dim lineCount = File.ReadAllLines(LogPath).Length

        If lineCount > 60 Then ' because I want my log to be 60 lines long
            Dim delLineCount As Integer = lineCount - 60
            Dim lines As List(Of String) = New List(Of String)(File.ReadAllLines(LogPath))
            lines.RemoveRange(0, delLineCount)
            File.WriteAllLines(LogPath, lines.ToArray())
        End If

我在关闭时执行此操作,以便在完成所有操作后进行修剪,并且我的日志文件长 60 行 :)

于 2016-08-19T15:16:52.277 回答
0

您应该尝试使用 3rd 方库,其中大部分应该包含此类功能 - 例如log4netNLogEnterprise Library

它们中的大多数都易于使用,具体取决于您正在执行多少日志记录,使用其中之一可能比自己编写此类功能更快,它将可靠且经过良好测试,并且还提供其他有用的功能。

编辑

我的主要经验是使用 Enterprise Library,我总是使用@paxdiablo 在他的回答中描述的技术,每 x 天/周/Kb/等开始一个新的日志文件。我不确定将单个文件截断为特定大小,但我想这些库可以做到这一点。

于 2010-10-29T12:03:40.403 回答
0

一种方法是为此利用开源解决方案。Log4Net 是我的许多同行反复使用的一种。它具有处理您正在谈论的内容的功能。添加引用,添加配置文件来设置日志记录选项(保留多少等),然后调用库进行日志记录。

http://logging.apache.org/log4net/

于 2010-10-29T12:03:42.050 回答