Считать логи сервера, создать список пользователей и дату последнего захода - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д