我喜欢确保我的程序
(尤其是根本没有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文件包含在内。 请享用!