0

Хорошо, поэтому я работаю в VB.NET, вручную записывая журналы ошибок в файлы журнала (да, я знаю, я не звонил). Теперь, если файлы превышают произвольный размер, когда функция переходит на запись новых данных об ошибке, она должна начать новый файл с новым именем файла.FileInfo возвращает неправильное значение?

Вот функция:

 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 ошибок во всех сразу. Опять же, я знаю, что есть более эффективные способы справиться с этим системно, но это был код, который мне сказали реализовать.

Как я могу надежно получить размер файла журнала перед тем, как писать ему, как я пытаюсь сделать выше?

+1

Почему вы сравнивая размер файла, который является 'Long', к' Double'? Этот максимальный размер также должен быть «длинным», а затем вы можете сравнить два значения правильно. Почему именно вы считаете, что «Длина» ошибается? – jmcilhinney

+0

Ну, это двойная вещь, потому что я, по-видимому, дурак. И я думаю, что это неправильно, потому что я тестирую с использованием фиктивных данных и значений, поэтому он всегда * бросает ошибку, и я знаю, сколько байтов каждая ошибка добавляет к файлу. После регистрации четырех ошибок он должен перейти к новому файлу. Когда я проходил через это, это делалось. Когда я разрешаю ему работать, это не так. –

+0

@jmcilhinney Спасибо за ваши вопросы - они помогли мне добраться до корня моей проблемы. –

ответ

1

Ну, как и во многих вещах, ответ на этот вопрос оказался «вы внимательно прочитали свой собственный код» с боковым приказом «съесть что-нибудь, вам нужно исправить уровень сахара в крови».

В обзоре я видел, что я всегда проверял BaseFileName и, если бы это было по произвольному пределу, добавление символа и запись в этот файл. То, что я не делал, это проверить, существует ли этот файл или, действительно, другие более свежие файлы. Я решил, что проблема заключается в том, чтобы захватить список каталогов всех файлов, соответствующих аргументу «BaseFileName *» в Directory.GetFiles, и выбрать самый последний доступный. Это гарантирует, что регистратор всегда будет выбирать более текущий файл для записи или -f обязательно использовать в качестве базового имени для другого добавленного символа.

Вот этот код:

 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 
Смежные вопросы