Считать логи сервера, создать список пользователей и дату последнего захода - Visual Basic .NET

Узнай цену своей работы

Формулировка задачи:

Доброго времени! Есть папка с логами, в ней логи с расширением .log за последние несколько месяцев. Новый файл лога создается каждые 4 часа. Задача: 1. Просмотреть логи за последние 3 недели (

исключая сегодняшний день

) 2. Найти все вот такие строчки: "2016-08-07 20:02:49.212 - Thread: 6 -> OnConnectedClient Player1 attempt" 3. Создать список из имен пользователей (в данном случае - Player1) без повторов с указанием сколько дней назад пользователь последний раз заходил на сервер. 4. Создать (перезаписать) файл

SettFile.txt

вида: 10.08.16 'сегодняшняя дата Player1:12 'имя игрока:сколько дней назад заходил Player2:3 Player3:17 и т.д. 5. При последующих запусках программы (планирую запускать раз в сутки в 1:00): - Считать файл SettFile.txt - Просмотреть логи за дату, указанную в файле - Добавить новых пользователей (если такие будут) - Если зайдут пользователи из уже записанных в файле - поменять им значение на 1. - Всем остальным, соответственно, увеличить значение на 1. - Перезаписать файл SettFile.txt Какие вопросы: А) как получить дату "3 недели назад"? Б) Как организовать массив в который будет считываться файл SettFile.txt так, чтобы с ним было удобно работать (менять числа, добавлять строки и т.д.) В) Как правильно считать имена пользователей БЕЗ ПОВТОРОВ, да и еще выбрать самые "свежие" даты захода? У меня мысль только одна - считывать логи начиная с самого свежего и добавлять имена в hashset (с которым я не умею работать), но как установить порядок считывания по дате - не знаю. Что я пока сделал (да практически ничего):
Листинг программы
  1. Imports System
  2. Imports System.IO
  3. Module Module1
  4. Dim LogPath As String = "D:\Temp\logs"
  5. Dim SettFile As String = "SettFile.txt"
  6. Dim SettArr() As String
  7. Dim Logs As New List(Of String)
  8. Dim LastWrTime As String
  9. Dim thisDate As Date = Today
  10. Dim Date3Week As Date '3 недели назад
  11. Sub Main()
  12. ' считываем построчно файл SettFile.txt в массив
  13. If My.Computer.FileSystem.FileExists(LogPath & SettFile) Then
  14. SettArr = File.ReadAllLines(SettFile, System.Text.Encoding.Default)
  15. End If
  16. 'получаем список файлов за предыдущие даты
  17. For Each foundFile As String In My.Computer.FileSystem.GetFiles(LogPath, Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, "SpaceEngineersDedicated*.log")
  18. Dim fi As FileInfo = New FileInfo(foundFile)
  19. If Date3Week < fi.LastWriteTime.Date And fi.LastWriteTime.Date < thisDate Then
  20. Logs.Add(foundFile)
  21. End If
  22. Next
  23. Dim fis As FileInfo = New FileInfo(Logs(0))
  24. MsgBox(fis.LastWriteTime.Date)
  25. MsgBox(thisDate)
  26. End Sub
  27. 'записываем файл SettFile.txt
  28. Sub WriteSettFile(ByVal SetArr() As String)
  29. File.WriteAllLines(SettFile, SetArr)
  30. End Sub
  31. End Module
Мне, в принципе, нужны только подсказки - какими функциями воспользоваться, как организовать и т.п. Разберусь. Заранее благодарен.

Решение задачи: «Считать логи сервера, создать список пользователей и дату последнего захода»

textual
Листинг программы
  1. Imports System
  2. Imports System.IO
  3.  
  4. Module Module1
  5.     Dim LogPath As String = "D:\Temp\logs"
  6.     Dim SettFile As String = "SettFile.txt"
  7.     Dim CompStr As String = "OnConnectedClient"
  8.     Dim SettArr() As String
  9.     Dim WorkArr As New List(Of String())
  10.     Dim Logs As New List(Of String)
  11.     Dim LastWrTime As String
  12.     Dim thisDate As Date = Today
  13.     Dim Date3Week As Date '3 недели назад
  14.     Dim PlayerNames As New HashSet(Of String)
  15.     Dim DayCount As Integer
  16.     Dim k1 As Integer
  17.     Dim k2 As Integer
  18.     Dim player As String
  19.     Dim TempStr As String
  20.  
  21.     Sub Main()
  22.         If My.Computer.FileSystem.FileExists(LogPath & SettFile) Then
  23.             SettArr = File.ReadAllLines(LogPath & SettFile, System.Text.Encoding.Default)
  24.             Date3Week = SettArr(0)
  25.             For i = 1 To SettArr.Count - 1
  26.                 WorkArr.Add(SettArr(i).Split(":"))
  27.                 PlayerNames.Add(WorkArr(i - 1)(0))
  28.             Next
  29.         Else
  30.             Date3Week = thisDate.AddDays(-21)
  31.         End If
  32.         'получаем список файлов за предыдущие даты
  33.         For Each foundFile As String In My.Computer.FileSystem.GetFiles(LogPath, Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, "SpaceEngineersDedicated*.log")
  34.             Dim fi As FileInfo = New FileInfo(foundFile)
  35.             ' если дата файла меньше сегодняшнего числа, но больше чем 3 днедели назад
  36.             If Date3Week <= fi.LastWriteTime.Date And fi.LastWriteTime.Date < thisDate Then
  37.                 ' Считываем файл построчно, ищем строку с OnConnectClient
  38.                 Using d_SR As New StreamReader(foundFile)
  39.                     Do Until d_SR.EndOfStream
  40.                         TempStr = d_SR.ReadLine
  41.                         k1 = InStr(TempStr, CompStr)
  42.                         If k1 > 0 Then
  43.                             'Обрезаем строку до имени пользователя
  44.                             player = Mid(TempStr, k1 + 18)
  45.                             player = Left(player, player.Length - 8)
  46.                             'ПЫТАЕМСЯ: добавить в хэшсет, и в наш рабочий массив
  47.                             If PlayerNames.Add(player) = True Then
  48.                                 WorkArr.Add({player, thisDate.DayOfYear - fi.LastWriteTime.Date.DayOfYear})
  49.                             Else
  50.                                 If WorkArr(Array.IndexOf(PlayerNames.ToArray, player))(1) > thisDate.DayOfYear - fi.LastWriteTime.Date.DayOfYear Then
  51.                                     WorkArr(Array.IndexOf(PlayerNames.ToArray, player))(1) = thisDate.DayOfYear - fi.LastWriteTime.Date.DayOfYear
  52.                                 End If
  53.                             End If
  54.                         End If
  55.                     Loop
  56.                 End Using
  57.             End If
  58.         Next
  59.         ReDim SettArr(WorkArr.Count)
  60.         SettArr(0) = thisDate
  61.         For l = 0 To WorkArr.Count - 1
  62.             SettArr(l + 1) = WorkArr(l)(0) & ":" & WorkArr(l)(1)
  63.         Next
  64.  
  65.         File.Delete(LogPath & SettFile)
  66.         File.WriteAllLines(LogPath & SettFile, SettArr)
  67.  
  68.     End Sub
  69.  
  70. End Module

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.167 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы