Считать логи сервера, создать список пользователей и дату последнего захода - 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 (с которым я не умею работать), но как установить порядок считывания по дате - не знаю. Что я пока сделал (да практически ничего):Мне, в принципе, нужны только подсказки - какими функциями воспользоваться, как организовать и т.п. Разберусь. Заранее благодарен.
Решение задачи: «Считать логи сервера, создать список пользователей и дату последнего захода»
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