none
VB 2008 Log-Datei-Prüfer RRS feed

  • Frage

  • Ich benötige ein Programm, welches sämtliche Ordner und deren Inhalt liest, und die beinhaltenden .log Dateien Zeilenweise ausliest und bestimmte Zeilen auf deren Inhalt überprüft

     

    Der Code derzeit:

    Option Explicit On
    
    Imports System.IO
    
    Public Class frm_main
    
     Private Sub frm_main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
     End Sub
    
     Private Sub cmd_log_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_log.Click
    Dim logdateien As String 'Logdateien Dim pfad As String = Dir("Übergeordneter Ordner", FileAttribute.Directory) Dim temp As String Dim verzeichnisse() As String 'Variable für Unterverzeichnisse Dim n As Integer 'Zähler Variable für die Unterverzeichnisse Dim anmeldung1 As Boolean 'Überprüfungsvariable Dim anmeldung2 As Boolean 'Überprüfungsvariable Dim verarbeitet As String Überprüfungsvariable Dim angelegt As String 'Überprüfungsvariable Dim Eingabe As StreamReader 'Der StreamReader, der die Zeilen auslesen soll Dim text As String 'Variable die die Zeilen auslesen soll n = 0 ReDim verzeichnisse(n) Do While pfad <> "" If pfad <> "." And pfad <> ".." And pfad <> "TrapGen.exe" And pfad <> "logs_pruefen.xls" Then verzeichnisse(n) = pfad n = n + 1 ReDim Preserve verzeichnisse(n) End If pfad = Dir()
    Loop For n = 0 To UBound(verzeichnisse) - 1 pfad = ("Pfad zu Übergeordnetem Verzeichniss" & verzeichnisse(n) & "\log\") logdateien = Dir(pfad & "*.log") Eingabe = New StreamReader(pfad & logdateien) text = Eingabe.ReadLine Next Do text = Eingabe.ReadLine If Eingabe.ReadLine.Contains("Überprüfung ob OK oder nicht OK") Then anmeldung1 = True End If If Eingabe.ReadLine.Contains("Überprüfung ob OK oder nicht OK") Then anmeldung2 = True End If If Eingabe.ReadLine.Contains("Frage nach einem Wert(Zahl)") > 0 Then
    verarbeitet = Mid(temp, InStr(19, temp, "Frage nach der Zahl", vbTextCompare) + 28, Len(temp)) End If If Eingabe.ReadLine.Contains("Frage nach einem Wert(Zahl)") > 0 Then angelegt = Mid(temp, InStr(19, temp, "Frage nach der Zahl", vbTextCompare) + 31, Len(temp)) End If
    Loop If anmeldung1 = True And anmeldung2 = True Then If verarbeitet = angelegt Then End If
    End If End Sub End Class

     

     

    Die Überprüfungsvariablen sollen später dazu dienen, die Datei automatisch umzubenennen.

    Ich danke schon mal im Vorraus für Hilfe!

    Donnerstag, 24. Juni 2010 11:39

Antworten

Alle Antworten

  • Hi,

    Ich benötige ein Programm, welches sämtliche Ordner und deren Inhalt liest, und die beinhaltenden .log Dateien Zeilenweise ausliest und bestimmte Zeilen auf deren Inhalt überprüft


    Bzgl. des rekursiven Auslesens aller Dateien in Ordnern siehe:

      http://social.msdn.microsoft.com/Forums/de-DE/vbasicexpresseditionde/thread/85b57640-62bf-4834-bb64-a91568c8e9cd

    Du kannst einen Filter setzen, so dass bspw. nur *.log (also alle Dateien, die mit .log enden) ausgelesen werden.

    Den Inhalt einzelner Dateien kannst Du dann so ermitteln:

      http://msdn.microsoft.com/de-de/library/ms143368.aspx

    In Verbindung mit der Split Funktion zum Auftrennen des Inhalts in Zeilen (ggfs. dann sinnvoll, wenn es nicht allzuviele Zeilen pro Datei sein)

      http://msdn.microsoft.com/de-de/library/1bwe3zdy.aspx

    Der Rest (also das Suchen des Strings, ...) dürfte ja kein Problem sein, oder?

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    • Als Antwort markiert Morpheus4213 Dienstag, 29. Juni 2010 13:17
    Donnerstag, 24. Juni 2010 15:15
    Moderator
  • Hat mir ziemlich weitergeholfen, aber fertig ist das Programm leider noch lange nicht.

    Die Split-Funktion will mir nicht so ganz in den Kopf gehen und ich waage auch(nach nachlesen der Funktion und ihrem Einsatz) zu bezweifeln, dass sie für mein Programm die beste Option ist.

    Gibt es noch eine andere Möglichkeit, Zeilen eines Dokuments auszulesen und zu bewerten? Das ganze müsste am Ende in eine Schleife gepackt werden aber ich denke das dürfte zu schaffen sein. Das schwierige an dem Programm ist es immerhin, dass mehrere Log-Dateien sich in den Ordnern befinden und nicht nur die Ordner, sondern auch sämtliche Dateien überprüft und dannach umbenannt werden sollen.

    Dienstag, 29. Juni 2010 13:20
  • Hallo,

    anstatt ReadAllText kannst Du auch ReadAllLines verwenden.
    Damit hast Du bereits die Zeilen in einem Array vorliegen.
    Und soweit man dem obigen (unfertigen) Code entnehmen kann,
    kannst Du darauf Deine "Tests" ausführen.

    Gruß Elmar

    Mittwoch, 30. Juni 2010 08:05
    Beantworter
  • Hallo,

    ich habe Deinen Code etwas umstrukturiert, so dass Du dem Programmablauf besser folgen
    können solltest und einige ältere Konstrukte elemeniert, die mehr stören als dass sie helfen.

    Schau es Dir zunächst mal an, in dem Du die Klasse in Dein Programm einfügst.
    Der Aufruf wäre zunächst einmal

        ProtokolleAuswerten.StandardAuswertung()
    

    Einige Stellen konnte ich mit den Informationen nicht eindeutig klären.
    So ist insbesondere die Stelle mit der Auswertung für die Anzahlen im Original zumindest problematisch.
    Am Ende kommt hier eine Auflistung von Strukturen (Protokoll) heraus,
    die hier zunächst einfach nur ausgegeben wird.
    Was Du damit weiter machst wäre der nächste Schritt...

    Option Explicit On
    Option Strict On
    Option Infer On
    
    Imports System.IO
    
    Friend Structure Protokoll
      Public Dateiname As String
    
      Public PSIPENTA As Boolean
      Public MySqlAnmeldung As Boolean
    
      Public VerarbeitetZeile As Integer ' Zeile in Datei
      Public VerarbeitetIndex As Integer ' Position in Zeile
    
      Public AngelegtZeile As Integer   ' Zeile in Datei
      Public AngelegtIndex As Integer   ' Zeile in Datei
    
      Public Overrides Function ToString() As String
        Return String.Format("{0}: Anmeldung: {1}, MySql: {2}, Verarbeitet: ({3}, {4}), Angelegt: ({5}, {6})", _
          Me.Dateiname, Me.PSIPENTA, Me.MySqlAnmeldung, _
          Me.VerarbeitetZeile, Me.VerarbeitetIndex, Me.AngelegtZeile, Me.AngelegtIndex)
      End Function
    End Structure
    
    
    Friend Class ProtokolleAuswerten
      Dim verzeichnis As String
      Dim protokollListe As List(Of Protokoll)
    
      Public Shared Sub StandardAuswertung()
        Dim auswertung As New ProtokolleAuswerten("D:\MySqlKdVorgAnl\")
    
        auswertung.Auswerten()
    
        For Each p In auswertung.Protokolle
          Console.WriteLine(p.ToString())
        Next
      End Sub
    
    
      Public Sub New(ByVal startVerzeichnis As String)
        If String.IsNullOrEmpty(startVerzeichnis) Then
          Throw New ArgumentNullException("startVerzeichnis")
        End If
        If Not Directory.Exists(startVerzeichnis) Then
          Throw New ArgumentException(String.Format("'{0}' ist kein Verzeichnis.", startVerzeichnis), "startVerzeichnis")
        End If
        Me.verzeichnis = startVerzeichnis
      End Sub
    
      Public ReadOnly Property Protokolle As List(Of Protokoll)
        Get
          If Me.protokollListe Is Nothing Then
            Throw New InvalidOperationException("Zuerst Auswerten aufrufen!")
          End If
    
          Return Me.protokollListe
        End Get
      End Property
    
      Public Sub Auswerten()
        Try
          ' Alle Unterverzeichnisse durchsuchen, die "LOG" heissen
          For Each verzeichnisName As String In Directory.GetDirectories(Me.verzeichnis, "log", SearchOption.AllDirectories)
            Me.protokollListe = VerzeichnisAuswerten(verzeichnisName)
          Next
        Catch ex As Exception
          Throw New InvalidOperationException("Fehler beim Verarbeiten der Protokolldateien", ex)
        End Try
      End Sub
    
      Private Function VerzeichnisAuswerten(ByVal verzeichnisName As String) As List(Of Protokoll)
        Dim protokollListe As New List(Of Protokoll)
        For Each dateiName In Directory.GetFiles(verzeichnisName, "*.log", SearchOption.TopDirectoryOnly)
          Dim p = DateiAuswerten(dateiName)
    
          protokollListe.Add(p)
        Next
        Return protokollListe
      End Function
    
      Private Function DateiAuswerten(ByVal dateiName As String) As Protokoll
        Dim dateiProtokoll As New Protokoll
    
        dateiProtokoll.Dateiname = dateiName
    
        ' Verwendet hier UTF-8 Kodierung - wegen Umlauten wichtig das es hier stimmt!
        Using reader As New StreamReader(dateiName, System.Text.Encoding.UTF8)
    
          Dim zeilenIndex As Integer = 0
          Dim zeile = reader.ReadLine()
          Do While zeile IsNot Nothing
            zeilenIndex += 1
            If zeile.IndexOf("PSIPENTA: Anmeldung ok", StringComparison.OrdinalIgnoreCase) >= 0 Then
              dateiProtokoll.PSIPENTA = True
            ElseIf zeile.IndexOf("MySQL: Anmeldung ok", StringComparison.OrdinalIgnoreCase) >= 0 Then
              dateiProtokoll.MySqlAnmeldung = True
            ElseIf zeile.IndexOf("Anzahl verarbeiteter", StringComparison.OrdinalIgnoreCase) >= 0 Then
              dateiProtokoll.VerarbeitetZeile = zeilenIndex
              dateiProtokoll.VerarbeitetIndex = ZeilenWert(zeile, "Anzahl verarbeiteter Köpfe: 0", 1)
            ElseIf zeile.IndexOf("Anzahl angelegter", StringComparison.OrdinalIgnoreCase) >= 0 Then
              dateiProtokoll.AngelegtZeile = zeilenIndex
              dateiProtokoll.AngelegtIndex = ZeilenWert(zeile, "Anzahl angelegter KD-Vorgänge: 0", 1)
            End If
    
            ' Hier: Abbrechen, wenn eine oder alle Bedingungen erfüllt sind???
    
            zeile = reader.ReadLine()
          Loop
        End Using
        Return dateiProtokoll
      End Function
    
      Private Shared Function ZeilenWert(ByVal zeile As String, ByVal anfang As String, ByVal länge As Integer) As Integer
        ' Ermittelt die Position des Textes und extrahiert die Zahl danach mit Länge
        Dim position As Integer = zeile.IndexOf(anfang, StringComparison.OrdinalIgnoreCase)
        If position = -1 Then
          Return -1 ' Nicht gefunden
        End If
        position += anfang.Length + 1
        Dim wert As Integer
        If Integer.TryParse(zeile.Substring(position, länge), wert) Then
          Return wert
        End If
        Return -2 ' Keine Zahl
      End Function
    
    End Class
    
    
    Gruß Elmar

     

    Donnerstag, 1. Juli 2010 15:49
    Beantworter