0

好的,所以我在 VB.NET 中工作,手动将错误日志写入日志文件(是的,我知道,我没有打电话)。现在,如果文件超过任意大小,当函数开始写出新的错误数据时,它应该使用新文件名启动一个新文件。

这是功能:

        Dim listener As New Logging.FileLogTraceListener
        listener.CustomLocation = System.Configuration.ConfigurationManager.AppSettings("LogDir")
        Dim loc As String = DateTime.UtcNow.Year.ToString + DateTime.UtcNow.Month.ToString + DateTime.UtcNow.Day.ToString + DateTime.UtcNow.Hour.ToString + DateTime.UtcNow.Minute.ToString

        listener.BaseFileName = loc

        Dim logFolder As String
        Dim source As String

        logFolder = ConfigurationManager.AppSettings("LogDir")
        If ex.Data.Item("Source") Is Nothing Then
            source = ex.Source
        Else
            source = ex.Data.Item("Source").ToString
        End If

        Dim errorFileInfo As New FileInfo(listener.FullLogFileName)

        Dim errorLengthInBytes As Long = errorFileInfo.Length


        If (errorLengthInBytes > CType(System.Configuration.ConfigurationManager.AppSettings("maxFileSizeInBytes"), Long)) Then

            listener.BaseFileName = listener.BaseFileName + "1"

        End If


        Dim msg As New System.Text.StringBuilder
        If String.IsNullOrEmpty(logFolder) Then logFolder = ConfigurationManager.AppSettings("LogDir")

        msg.Append(vbCrLf & "Exception" & vbCrLf)
        msg.Append(vbTab & String.Concat("App: AppMonitor | Time: ", Date.Now.ToString) & vbCrLf)
        msg.Append(vbTab & String.Concat("Source: ", source, " | Message: ", ex.Message) & vbCrLf)
        msg.Append(vbTab & "Stack: " & ex.StackTrace & vbCrLf)


        listener.Write(msg.ToString())
        listener.Flush()

        listener.Close()

为了测试目的,我在一个循环中执行了这个,所以我可以看到当它一次得到(比如说)10000 个错误时会发生什么。同样,我知道有更好的方法来系统地处理这个问题,但这是我被告知要实现的代码。

正如我在上面尝试做的那样,如何在写入之前可靠地获取日志文件的大小?

4

1 回答 1

1

好吧,就像很多事情一样,这个问题的答案原来是“你仔细阅读了自己的代码吗?”并附带了“吃点东西,你需要解决血糖问题”的附带命令。

在审查时,我发现我一直在检查 BaseFileName,如果它超过了任意限制,则附加一个字符并写入该文件。我没有做的是检查该文件是否存在,或者确实存在其他更新的文件。我已经解决了获取与 Directory.GetFiles 中的“BaseFileName*”参数匹配的所有文件的目录列表并选择最近访问的文件的问题。这确保了记录器将始终选择更新的文件来写入或 - 如果需要 - 用作另一个附加字符的基本名称。

这是代码:

        Dim directoryFiles() As String = Directory.GetFiles(listener.Location.ToString(), listener.BaseFileName + "*")

        Dim targetFile As String = directoryFiles(0)

        For j As Integer = 1 To directoryFiles.Count - 1 Step 1
            Dim targetFileInfo As New FileInfo(targetFile)
            Dim compareInfo As New FileInfo(directoryFiles(j))

            If (targetFileInfo.LastAccessTimeUtc < compareInfo.LastAccessTimeUtc) Then
                targetFile = directoryFiles(j)
            End If
        Next


        Dim errorFileInfo As New FileInfo(listener.Location.ToString() + targetFile)
        Dim errorLengthInBytes As Long = errorFileInfo.Length
于 2015-08-07T15:56:00.133 回答