Считать логи сервера, создать список пользователей и дату последнего захода - 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 (с которым я не умею работать), но как установить порядок считывания по дате - не знаю. Что я пока сделал (да практически ничего):
Листинг программы
- Imports System
- Imports System.IO
- Module Module1
- Dim LogPath As String = "D:\Temp\logs"
- Dim SettFile As String = "SettFile.txt"
- Dim SettArr() As String
- Dim Logs As New List(Of String)
- Dim LastWrTime As String
- Dim thisDate As Date = Today
- Dim Date3Week As Date '3 недели назад
- Sub Main()
- ' считываем построчно файл SettFile.txt в массив
- If My.Computer.FileSystem.FileExists(LogPath & SettFile) Then
- SettArr = File.ReadAllLines(SettFile, System.Text.Encoding.Default)
- End If
- 'получаем список файлов за предыдущие даты
- For Each foundFile As String In My.Computer.FileSystem.GetFiles(LogPath, Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, "SpaceEngineersDedicated*.log")
- Dim fi As FileInfo = New FileInfo(foundFile)
- If Date3Week < fi.LastWriteTime.Date And fi.LastWriteTime.Date < thisDate Then
- Logs.Add(foundFile)
- End If
- Next
- Dim fis As FileInfo = New FileInfo(Logs(0))
- MsgBox(fis.LastWriteTime.Date)
- MsgBox(thisDate)
- End Sub
- 'записываем файл SettFile.txt
- Sub WriteSettFile(ByVal SetArr() As String)
- File.WriteAllLines(SettFile, SetArr)
- End Sub
- End Module
Решение задачи: «Считать логи сервера, создать список пользователей и дату последнего захода»
textual
Листинг программы
- Imports System
- Imports System.IO
- Module Module1
- Dim LogPath As String = "D:\Temp\logs"
- Dim SettFile As String = "SettFile.txt"
- Dim CompStr As String = "OnConnectedClient"
- Dim SettArr() As String
- Dim WorkArr As New List(Of String())
- Dim Logs As New List(Of String)
- Dim LastWrTime As String
- Dim thisDate As Date = Today
- Dim Date3Week As Date '3 недели назад
- Dim PlayerNames As New HashSet(Of String)
- Dim DayCount As Integer
- Dim k1 As Integer
- Dim k2 As Integer
- Dim player As String
- Dim TempStr As String
- Sub Main()
- If My.Computer.FileSystem.FileExists(LogPath & SettFile) Then
- SettArr = File.ReadAllLines(LogPath & SettFile, System.Text.Encoding.Default)
- Date3Week = SettArr(0)
- For i = 1 To SettArr.Count - 1
- WorkArr.Add(SettArr(i).Split(":"))
- PlayerNames.Add(WorkArr(i - 1)(0))
- Next
- Else
- Date3Week = thisDate.AddDays(-21)
- End If
- 'получаем список файлов за предыдущие даты
- For Each foundFile As String In My.Computer.FileSystem.GetFiles(LogPath, Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, "SpaceEngineersDedicated*.log")
- Dim fi As FileInfo = New FileInfo(foundFile)
- ' если дата файла меньше сегодняшнего числа, но больше чем 3 днедели назад
- If Date3Week <= fi.LastWriteTime.Date And fi.LastWriteTime.Date < thisDate Then
- ' Считываем файл построчно, ищем строку с OnConnectClient
- Using d_SR As New StreamReader(foundFile)
- Do Until d_SR.EndOfStream
- TempStr = d_SR.ReadLine
- k1 = InStr(TempStr, CompStr)
- If k1 > 0 Then
- 'Обрезаем строку до имени пользователя
- player = Mid(TempStr, k1 + 18)
- player = Left(player, player.Length - 8)
- 'ПЫТАЕМСЯ: добавить в хэшсет, и в наш рабочий массив
- If PlayerNames.Add(player) = True Then
- WorkArr.Add({player, thisDate.DayOfYear - fi.LastWriteTime.Date.DayOfYear})
- Else
- If WorkArr(Array.IndexOf(PlayerNames.ToArray, player))(1) > thisDate.DayOfYear - fi.LastWriteTime.Date.DayOfYear Then
- WorkArr(Array.IndexOf(PlayerNames.ToArray, player))(1) = thisDate.DayOfYear - fi.LastWriteTime.Date.DayOfYear
- End If
- End If
- End If
- Loop
- End Using
- End If
- Next
- ReDim SettArr(WorkArr.Count)
- SettArr(0) = thisDate
- For l = 0 To WorkArr.Count - 1
- SettArr(l + 1) = WorkArr(l)(0) & ":" & WorkArr(l)(1)
- Next
- File.Delete(LogPath & SettFile)
- File.WriteAllLines(LogPath & SettFile, SettArr)
- End Sub
- End Module
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д