Считать логи сервера, создать список пользователей и дату последнего захода - 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

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

12   голосов , оценка 4.167 из 5
Похожие ответы