简单的子类/类可写入有限长度的日志文件(AKA循环缓冲区文件)

我喜欢确保我的程序

(尤其是根本没有UI的服务)以有意义的方式记录错误。 添加日志文件功能非常容易,但是不幸的是,除非采取预防措施,否则日志文件可能永远永久地增长。

几年前,我与一个团队一起工作,我们发现客户站点的一个主要问题仅仅是因为日志记录耗尽了所有可用磁盘空间。

最近我写了一个小服务。 我想记录所有错误,但是需要确保日志文件不会永远增长。

我想出了以下代码:


   Private Sub Logit(ByVal Message As String, Optional MaxEntries As Integer = 99)
        Static LogLines As New List(Of String)
        Static LogFile As New FileInfo(My.Application.Info.DirectoryPath & "\Sandbox.log")
        If LogLines.Count = 0 Then
            If LogFile.Exists Then
                Try
                    LogLines = IO.File.ReadAllLines(LogFile.FullName).ToList
                Catch ex As Exception
                    Exit Sub  'there's nothing we can do really...
                End Try
            End If
        End If 
        'clean up the message
        If Message.EndsWith(Environment.NewLine) Then
            Message = Message.Substring(0, Message.Length - 2)
        End If
        Message = System.DateTime.Now & "     " & Message
        LogLines.Add(Message) 
        'make sure we keep only MaxEntries entries
        Do While LogLines.Count > Me.MaxLogLines
            LogLines.RemoveAt(0)
        Loop 
        Try
            IO.File.WriteAllLines(LogFile.FullName, LogLines)
        Catch ex As Exception
            'There's no where to log it so just ignore error
        End Try 
    End Sub 
此子项仅允许您将消息发送到日志文件,并限制日志中的行数。 通过dafault,它是99行。 当您添加第100行时,最前面的行会被修剪掉。 这意味着日志将不会无限增长,只会有您想要的任意多行。

使用此例程时,我建议您不要在每次被调用时都使用“魔术”数字(例如

Logit(MyMessage,150) )。 而是使用const(例如Logit(MyMessage,MY_MAX_LOG_ENTRIES) )。

用不同的数字调用例程可能会导致非常混乱的结果。 我也不喜欢如何在子目录中创建日志文件名。 但是对于小型程序,这是简单而直接的。

更好的方法是

创建一个强制您将其初始化为最大条目和文件名的类-这样会更干净,看起来像这样:

Imports System.IO 
Public Class LimitLog 
    Sub New(ByVal MaxLogLines As Integer, LogFileName As String)
        Me.MaxLogLines = MaxLogLines
        Me.LogFileName = New FileInfo(LogFileName)
    End Sub 
    Sub New(LogFileName As String)
        Me.LogFileName = New FileInfo(LogFileName)
    End Sub 
    Public Property MaxLogLines As Integer = 99
    Public Property LogFileName As FileInfo 
    Public Sub Logit(ByVal Message As String)
        Static LogLines As New List(Of String)
        If LogLines.Count = 0 Then
            If Me.LogFileName.Exists Then
                Try
                    LogLines = IO.File.ReadAllLines(Me.LogFileName.FullName).ToList
                Catch ex As Exception
                    Exit Sub  'there's nothing we can do really...
                End Try
            End If
        End If 
        'clean up the message
        If Message.EndsWith(Environment.NewLine) Then
            Message = Message.Substring(0, Message.Length - 2)
        End If
        Message = System.DateTime.Now & "     " & Message
        LogLines.Add(Message) 
        'make sure we keep only MaxEntries entries
        Do While LogLines.Count > Me.MaxLogLines
            LogLines.RemoveAt(0)
        Loop 
        Try
            IO.File.WriteAllLines(Me.LogFileName.FullName, LogLines)
        Catch ex As Exception
            'There's no where to log it so just ignore error
        End Try 
    End Sub 
End Class 
使用此类很容易; 只需实例化一个对象,如下所示: Friend MyLogger作为New LimitLog(150,MyLogFileName)

要么

朋友MyLogger作为新的LimitLog(MyLogFileName)

注意,该类有两个(超载)New子。 一种允许您使用最大条目数和日志文件名来初始化对象。 另一个仅获取文件名,并使用默认的99个条目。

请注意,没有New()子项(没有参数)-创建对象时,这将强制您设置文件名和最大行数,或者仅设置文件名。 这样更整洁,更干净-更不容易出错。 现在,每次致电

MyLogger.Logit只是消息,它将被添加到日志文件的末尾。 有关错误检查的注意事项

您可能希望多进行一些错误检查。 但是请注意,我进行的两次错误检查只是失败而被忽略了-这是因为这是一个旨在记录错误的日志文件例程-因此,如果其中存在错误-那么,没有其他地方可以记录错误了。 ..

当然-非常欢迎对此代码进行改进-您可以在此处发布。

我已经将该类作为超懒惰的zip文件包含在内。 请享用!

附加的文件
文件类型:zip LimitLog.zip (674字节,114视图)

From: https://bytes.com/topic/visual-basic-net/insights/946557-simple-sub-class-write-limited-length-log-file-aka-circular-buffer-file

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值