Usage Report aus Logfile

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Bernsi.

    Usage Report aus Logfile

    Hallo Leute,

    Ich versuche eine Auswertung eines Logfiles eines Lizenzdienstes zu schreiben, der mir anzeigt, welcher User gerade die Lizenz verwendet.

    Das Inputfile sieht folgendermaßen aus:

    ----------------------------------------
    Timestamp: 01.12.2017 09:00:27.507
    Message: ProductCodeNotExist, Lizenz "2621959" ist nicht vorhanden.
    Category: General
    ----------------------------------------
    Timestamp: 01.12.2017 09:00:28.209
    Message: ProductCodeNotExist, Lizenz "2621959" ist nicht vorhanden.
    Category: General
    ----------------------------------------
    Timestamp: 01.12.2017 09:00:28.396
    Message: ProductCodeNotExist, Lizenz "2621959" ist nicht vorhanden.
    Category: General
    ----------------------------------------
    Timestamp: 01.12.2017 09:00:28.614
    Message: ProductCodeNotExist, Lizenz "2621959" ist nicht vorhanden.
    Category: General
    ----------------------------------------
    Timestamp: 01.12.2017 09:00:32.826
    Message: ProductCodeNotExist, Lizenz "2621959" ist nicht vorhanden.
    Category: General
    ----------------------------------------
    Timestamp: 01.12.2017 09:00:35.073
    Message: LicenseLock, 1 Lizenzen ("DIRECTOR - User" "Kolben-Produktion@PCB12002:1") belegt.
    Category: General
    ----------------------------------------
    Timestamp: 01.12.2017 09:00:35.104
    Message: LicenseLockChange, [12/15] "DIRECTOR - User"
    Category: General
    ----------------------------------------
    Timestamp: 01.12.2017 09:00:41.796
    Message: ProductCodeNotExist, Lizenz "2621959" ist nicht vorhanden.
    Category: General
    ----------------------------------------
    Timestamp: 01.12.2017 09:00:41.937
    Message: ProductCodeNotExist, Lizenz "2621959" ist nicht vorhanden.
    Category: General
    ----------------------------------------
    Timestamp: 01.12.2017 09:06:21.613
    Message: ProductCodeNotExist, Lizenz "2621959" ist nicht vorhanden.
    Category: General
    ----------------------------------------
    Timestamp: 01.12.2017 09:06:40.053
    Message: LicenseProcessIDUnlock, Lizenz ("DIRECTOR - User" "xmsk-benutzer@PCK13008:1") für Prozess (ID=4336) freigegeben.
    Category: General
    ----------------------------------------
    Timestamp: 01.12.2017 09:06:43.282
    Message: LicenseProcessIDUnlock, Lizenz ("DIRECTOR - User" "xmsk-benutzer@PCK13008:1") für Prozess (ID=6704) freigegeben.
    Category: General
    ----------------------------------------
    Timestamp: 01.12.2017 09:06:44.265
    Message: LicenseProcessIDUnlock, Lizenz ("DIRECTOR - User" "xmsk-benutzer@PCK13008:1") für Prozess (ID=3508) freigegeben.
    Category: General
    ----------------------------------------
    Timestamp: 01.12.2017 09:06:45.310
    Message: LicenseProcessIDUnlock, Lizenz ("DIRECTOR - User" "xmsk-benutzer@PCK13008:1") für Prozess (ID=6744) freigegeben.
    Category: General
    ----------------------------------------
    Timestamp: 01.12.2017 09:06:45.341
    Message: LicenseUnlock, 1 Lizenzen ("DIRECTOR - User" "xmsk-benutzer@PCK13008:1") freigegeben.
    Category: General
    ----------------------------------------
    Timestamp: 01.12.2017 09:06:45.372
    Message: LicenseLockChange, [11/15] "DIRECTOR - User"
    Category: General
    ----------------------------------------
    Timestamp: 01.12.2017 09:07:56.493
    Message: LicenseLock, 1 Lizenzen ("DIRECTOR - User" "xmsk-benutzer@PCK13008:1") belegt.
    Category: General
    ----------------------------------------
    Timestamp: 01.12.2017 09:07:56.524
    Message: LicenseLockChange, [12/15] "DIRECTOR - User"
    Category: General
    ----------------------------------------
    Timestamp: 01.12.2017 09:08:00.736
    Message: ProductCodeNotExist, Lizenz "2621959" ist nicht vorhanden.
    Category: General
    ----------------------------------------
    Timestamp: 01.12.2017 09:12:26.141
    Message: ProductCodeNotExist, Lizenz "2621959" ist nicht vorhanden.
    Category: General
    ----------------------------------------
    Timestamp: 01.12.2017 09:12:28.325
    Message: ProductCodeNotExist, Lizenz "2621959" ist nicht vorhanden.
    Category: General
    ----------------------------------------
    Timestamp: 01.12.2017 09:12:43.301
    Message: LicenseProcessIDUnlock, Lizenz ("DIRECTOR - User" "xmsk-benutzer@PCK13008:1") für Prozess (ID=3408) freigegeben.
    Category: General
    ----------------------------------------
    Timestamp: 01.12.2017 09:13:50.756
    Message: LicenseProcessIDUnlock, Lizenz ("DIRECTOR - User" "xmsk-benutzer@PCK13008:1") für Prozess (ID=6348) freigegeben.
    Category: General
    ----------------------------------------
    Timestamp: 01.12.2017 09:13:54.671
    Message: LicenseProcessIDUnlock, Lizenz ("DIRECTOR - User" "xmsk-benutzer@PCK13008:1") für Prozess (ID=2968) freigegeben.
    Category: General
    ----------------------------------------
    Timestamp: 01.12.2017 09:13:55.841
    Message: LicenseProcessIDUnlock, Lizenz ("DIRECTOR - User" "xmsk-benutzer@PCK13008:1") für Prozess (ID=7032) freigegeben.
    Category: General
    ----------------------------------------
    Timestamp: 01.12.2017 09:13:55.841
    Message: LicenseUnlock, 1 Lizenzen ("DIRECTOR - User" "xmsk-benutzer@PCK13008:1") freigegeben.
    Category: General
    ----------------------------------------


    Wie man sieht wird bei Message "LicenseLock" die Lizenz von einem User ausgecheckt und mit "LicenseUnlock" später wieder eingecheckt.

    Was ich bis jetzt programmiert habe liefert mir folgendes Ergebnis:

    LicenseUnlock, "usernameA@PCB17006:1")
    LicenseUnlock, "xmsk-benutzer@PCK14048:1")
    LicenseLock, "xmsk-benutzer@PCK13008:1")
    LicenseUnlock, "xmsk-benutzer@PCK14045:5")
    LicenseUnlock, "usernameB@PCB13003:1")
    LicenseUnlock, "xmsk-benutzer@PCK14026:1")
    LicenseUnlock, "user-wkzb@PCK14026:2")


    Mir ist aber nicht klar wie ich den Usernamen sozusagen "Zustände" (Lizenz belegt/nicht belegt) zuweisen kann, sodass ich am Schluss nur noch User im Zustand "lizenz belegt" ausgespuckt bekomme.

    Hier mein Code den ich bis jetzt habe:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim module1(10, 10) As String
    4. Dim regdate As Date = Date.Now()
    5. Dim stringdate As String = regdate.ToString("dd.MM.yyyy")
    6. Dim username() As String
    7. Dim ausgecheckt As Boolean
    8. Dim i As Integer = 1
    9. Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser("pfadzumlog.log")
    10. MyReader.TextFieldType = FileIO.FieldType.Delimited
    11. Dim currentRow As String
    12. While Not MyReader.EndOfData
    13. Try
    14. currentRow = MyReader.ReadLine
    15. i = i + 1
    16. If currentRow Like "*LicenseLock*(""DIRECTOR - User*" And i = 5 Then
    17. 'OutputTxt.AppendText(currentRow & "Unlock" & vbNewLine)
    18. 'Lesen der einzelnen felder
    19. Dim fields As String() = Nothing
    20. fields = currentRow.Split(CType(" ", Char()))
    21. Dim s As String
    22. Dim fieldcounter As Integer = 1
    23. For Each s In fields
    24. fieldcounter = fieldcounter + 1
    25. If fieldcounter = 3 Then
    26. OutputTxt.AppendText(s & " ")
    27. ElseIf fieldcounter = 10 Then
    28. fieldcounter = 1
    29. ElseIf fieldcounter = 9 Then
    30. OutputTxt.AppendText(s & vbNewLine)
    31. End If
    32. Next s
    33. ElseIf currentRow Like "*LicenseUnlock*(""DIRECTOR - User*" And i = 5 Then
    34. 'OutputTxt.AppendText(currentRow & "Unlock" & vbNewLine)
    35. 'Lesen der einzelnen felder
    36. Dim fields As String() = Nothing
    37. fields = currentRow.Split(CType(" ", Char()))
    38. Dim s As String
    39. Dim fieldcounter As Integer = 1
    40. For Each s In fields
    41. fieldcounter = fieldcounter + 1
    42. If fieldcounter = 3 Then
    43. ausgecheckt = 0
    44. OutputTxt.AppendText(s & " ")
    45. ElseIf fieldcounter = 10 Then
    46. fieldcounter = 1
    47. ElseIf fieldcounter = 9 Then
    48. OutputTxt.AppendText(s & vbNewLine)
    49. End If
    50. Next s
    51. 'wenn in Zeile 2 dann +1 ansonsten zurück auf 1
    52. ElseIf i = 6 Then
    53. i = 1
    54. End If
    55. Catch ex As Microsoft.VisualBasic.
    56. FileIO.MalformedLineException
    57. MsgBox("Line " & ex.Message & "is not valid and will be skipped.")
    58. End Try
    59. End While
    60. End Using
    61. End Sub
    62. End Class



    Für ein paar Denkanstösse oder Hilfe wie man sowas angeht wäre ich sehr dankbar :D
    Lg
    Bernsi
    Hallo @Bernsi
    Du könntest eine Klasse "LizenzStatus" mit den Membern "username", "timestamp" und "ausgecheckt" erstellen, und diese dann in eine List(of LizenzStatus) packen.
    Beim Befüllen der Liste eine Abfrage machen, ob der User schon vorhanden ist, und je nachdem neu hinzufügen oder abändern.
    So könnte es aussehen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public LicStatus As New List(Of LizenzStatus)
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim tempUsername As String = ""
    5. Dim tempAusgecheckt As Boolean
    6. Dim tempTimestamp As Date
    7. Dim tempLizenzStatus As New LizenzStatus
    8. Dim currentRow As String
    9. Using MyReader As New IO.StreamReader("pfadzumlog.log")
    10. Do
    11. currentRow = MyReader.ReadLine()
    12. If currentRow Like "Timestamp*" Then
    13. tempTimestamp = CDate(currentRow.Substring(11))
    14. End If
    15. If currentRow Like "*LicenseLock,*" Or currentRow Like "*LicenseUnlock,*" Then
    16. 'Lesen der einzelnen felder
    17. Dim fields As String() = currentRow.Split(" "c)
    18. tempUsername = fields(7).Substring(1, (fields(7).Length - 3))
    19. tempAusgecheckt = If(fields(1) Like "*Unlock*", False, True)
    20. tempLizenzStatus = LicStatus.FirstOrDefault(Function(x) x.username = tempUsername)
    21. If tempLizenzStatus Is Nothing Then
    22. LicStatus.Add(New LizenzStatus() With {.timestamp = tempTimestamp, .ausgecheckt = tempAusgecheckt, .username = tempUsername})
    23. Else
    24. If tempLizenzStatus.timestamp < tempTimestamp Then
    25. 'tempLizenzStatus.username = tempUsername
    26. tempLizenzStatus.ausgecheckt = tempAusgecheckt
    27. tempLizenzStatus.timestamp = tempTimestamp
    28. End If
    29. End If
    30. End If
    31. Loop Until currentRow Is Nothing
    32. End Using
    33. For Each tls As LizenzStatus In LicStatus
    34. If tls.ausgecheckt Then
    35. OutputTxt.AppendText(tls.username & " " & tls.timestamp.ToString & Environment.NewLine)
    36. End If
    37. Next
    38. End Sub
    39. End Class
    40. Public Class LizenzStatus
    41. Public username As String
    42. Public timestamp As Date
    43. Public ausgecheckt As Boolean
    44. End Class
    Hallo Henry,

    Vielen dank, für deine Antwort. Ich habe den Code jetzt mal ganz stupide kopiert und getestet das schaut wirklich super aus.
    Ich werde jetzt noch versuchen das Ganze mit Hilfe meines VB.net Buches zu verstehen, denn im Moment weiss ich überhaupt nicht wie das funktioniert :)

    LG
    Bernsi
    @Bernsi Willkommen im Forum. :thumbup:
    Am besten, Du kommentierst jede einzelne Zeile des Codes.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Grüß euch,

    @'RodFromGermany danke so hab ich das jetzt mal durchgeackert.

    Das einzige was ich bis jetzt noch immer nicht verstehe ist folgende Zeile

    VB.NET-Quellcode

    1. tempLizenzStatus = LicStatus.FirstOrDefault(Function(x) x.username = tempUsername)


    Mir ist zwar klar das das die Abfrage sein muss ob der Username bereits in der Liste vorhanden ist, nur wie das funktioniert check ich leider überhaupt nicht.
    Hättet ihr da vll einen brauchbaren Link der so ein ähnliches Beispiel beschreibt?

    LG
    Bernsi