Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

    [VB.NET/2008]leggere sotto stringa in listbox

    Ciao a tutti,
    vengo al punto: Sto creando un piccolo tool in VB per monitorare una applicazione, in sostanza semplicemente prendo in input un file di log (formato testo) e lo carico in listbox e fino a qui tutto ok! ora ho implementato una funzione che controlla le righe della listbox e quando trova il messaggio di errore mi manda un alert per mail. Qui viene il problema allora per capire meglio vi posto la stringa di errore che dovrebbe leggere:
    29/04/2014 17:12:05 ERROR (IMATweetGeneratorBean.java:253) - Error tweeting ae539b72-0f3d-4fe1-8789-a38d656f4118-6
    Ora riesco a farlo funzionare se gli faccio prendere solo una parte della stringa così:

    codice:
        Public Sub TwitterFind()
            Dim MatchFound As Boolean = False
            Dim I As Integer = 0
            Me.ListBox1.Refresh()
            Do
                If InStr(Me.ListBox1.Items(I).ToString, "ERROR", CompareMethod.Text) > 0 Then
                    MatchFound = True
                    Me.ListBox1.SelectedIndex = I
                End If
                I += 1
            Loop Until (I >= Me.ListBox1.Items.Count) ' Or (MatchFound)
            'controlla se esiste la stringa ricercata allora manda messaggio altrimenti nada
            If MatchFound = True Then
                Call SendEmail()
            Else
                MsgBox("non ce nada", MsgBoxStyle.Information, Title:="Nagios Control Center")
            End If
    
        End Sub
    Quindi vede ERROR e manda la mail.. il problema è che il file di testo scorre e aggiorna continuamente la listbox e (fatto tramite timer) e mi invierebbe anche gli alert vecchi! dovrei in sostanza filtrare instr anche per data ma non funziona ad esempio ho provato così:

    codice:
    If InStr(Me.ListBox1.Items(I).ToString, Date.Today & " ERROR", CompareMethod.Text) > 0 Then
    Ossia cercami la data odiera più la stringa.... ma c'è di mezzo l'orario!!! che credo dia problemi non posso filtrare per orario perchè ovviamente non so quando di preciso arriva l'errore.... come potrei risolvere?

    grazie in anticipo

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2012
    Messaggi
    106
    Ciao,
    potresti salvarti le righe del file prima in un datatable e poi assegnare questo datatable alla tua listbox. In questo modo puoi filtrare come vuoi attraverso linq o defaultview (per framework vecchi).
    Puoi fare due colonne nel datatable, DATA e MESSAGGIO; la data la puoi tirar fuori tramite substring, presupponendo che la struttura della data sia sempre la stessa...

  3. #3
    In pratica dovrei gestirlo a colonne separate? sto provando con listview.... ma credo ho un problema per splittare i dati il log viene generato dividendo i campi con lo "spazio" non posso splittare con lo spazio? avresi qlc esempio in merito anche in listview? il lo è del tipo:

    27/01/2014 16:49:54 INFO (IMATweetGeneratorBean.java:129) - check for new events to tweet
    27/01/2014 16:49:55 INFO (IMATweetGeneratorBean.java:157) - 4
    27/01/2014 16:50:54 INFO (IMATweetGeneratorBean.java:129) - check for new events to tweet
    27/01/2014 16:50:55 INFO (IMATweetGeneratorBean.java:157) - 4
    27/01/2014 16:50:59 ERROR (IMATweetGeneratorBean.java:253) - Error tweeting ae539b72-0f3d-4fe1-8789-a38d656f4118-4
    grazie

  4. #4

    Moderazione

    Di che versione di VB stiamo parlando?
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Io farei così:
    1 - memorizzo in modo persistente la data e ora dell'ultimo valore letto (lastDayHourRead).
    2 - al prossimo avvio, nel ListBox, carico dal file di LOG solo i dati con data e ora maggiori
    3 - quando ho finito di scorrere il ListBox, aggiorno lastDayHourRead con la data e ora dell'ultimo valore letto
    e via così...

    In questo modo caricherai solo i dati non ancora elaborati.

    Per spiegarmi meglio:
    se lastDayHourRead contiene 27/01/2014 16:50:59 allora dal LOG vanno caricati solo i dati maggiori di tale data.

    Comunque tutto dipende da che linguaggio e versione usi, da cui si può poi scegliere quale tecnica è meglio adottare.
    Avresti dovuto indicarli nel titolo, al posto di scrivere (l'inutile) [Help!]

  6. #6
    Scusate la versione è visual studio 2008 il linguaggio è vb.NET

    @gibra ottimo approccio... anche se non capisco come posso fare dovrei cmq splittare le colonne ma il log è generato cosi come l'ho postato le parole sono separate da spazi e credo (correggetemi se sbaglio) non è splittabile con gli spazi. l'idea di aggiornare la listbox solo con i dati nuovi mettendo come discriminante la data e ora credo sia una giusta intuizione. Cerco di spulciare Zio Google per vedere se trovo qualche esempio adattabile... se vi capita materiale a riguardo non esistate a postare

    grazie

  7. #7
    Risolto!!! concatenando le condizioni con istr posto la funzione completa modificata:

    codice:
        'funzione cerca
        Public Sub TwitterFind()
            Try
    
                Dim MatchFound As Boolean = False
                Dim I As Integer = 0
                Dim dataoggi As String = Date.Today
                Me.ListBox1.Refresh()
                Do
    
                    'qui con la funzione InStr controllo la stringa di errore
                    If InStr(Me.ListBox1.Items(I).ToString, dataoggi, CompareMethod.Text) And InStr(Me.ListBox1.Items(I).ToString, "ERROR", CompareMethod.Text) > 0 Then
                        MatchFound = True
                        Me.ListBox1.SelectedIndex = I
                    End If
                    I += 1
                Loop Until (I >= Me.ListBox1.Items.Count) ' Or (MatchFound)
                'controlla se esiste la stringa ricercata allora manda messaggio altrimenti nada
                If MatchFound = True Then
                    Call SendEmail()
                    'Else
                    ' MsgBox("non ce nada", MsgBoxStyle.Information, Title:="Nagios Control Center")
                End If
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub
    In questo modo prende in condiderazione sia la data sia la stringa di errore sembra funzionare... Prememetto che non è perfetto in quanto se entrano più errori nello stesso giorno invierebbe i vecchi alert relativi alla giornata odierna. L'approccio ideale credo sia quello indicato da @gibra facendo analizzare solo le nuove righe di log ad ogni update del log stesso

  8. #8
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Bisogna vedere come è generato il LOG...

    Da quello che mi pare di capire il file di LOG non è generato giornalmente, ma è incrementato giornalmente.
    Se è davvero così, allora sicuramente il tuo approccio diventerà giorno per giorno sempre più 'pesante' e 'lento' perché carichi tutte le righe nel listbox quando magari di realmente nuove ce ne sono solo 50/100 o poco più...

    Non so quante righe vengono aggiunte ogni giorno, ma considera che il ListBox ha comunque dei limiti che presto o tardi saranno raggiunti, ed allora avrai un errore.

  9. #9
    Quote Originariamente inviata da gibra Visualizza il messaggio
    Bisogna vedere come è generato il LOG...

    Da quello che mi pare di capire il file di LOG non è generato giornalmente, ma è incrementato giornalmente.
    Se è davvero così, allora sicuramente il tuo approccio diventerà giorno per giorno sempre più 'pesante' e 'lento' perché carichi tutte le righe nel listbox quando magari di realmente nuove ce ne sono solo 50/100 o poco più...

    Non so quante righe vengono aggiunte ogni giorno, ma considera che il ListBox ha comunque dei limiti che presto o tardi saranno raggiunti, ed allora avrai un errore.
    Si! viene incrementato giornalmente e neanche di poco perchè la web application che lo genera (scritta i java) controlla varie cose (se i messaggi sono stati inviati, se ci sono nuovi messaggi da inviare, ecc....) in più ho il problema che devo fare una copia del file di log originale altrimenti mi nega l'accesso in lettura perchè risulta in uso dall'applicazione che lo genera (ho legato tale evento al timer, prima di controllare gli faccio copiare il file in una mi directory ed effettuo il controllo su quest' ultimo)... devo trovare la maniera di aggiornare la listbox solo con le righe di log nuove....

  10. #10
    Scusa ma non riesco a farlo per leggere da file le righe uso:
    codice:
     Try
                IO.File.Delete(dirlog & "\DL-IMA-PUSH.log")
                IO.File.Copy(frmSettings.txtwitter.Text, dirlog & "\DL-IMA-PUSH.log")
                Me.ListBox1.HorizontalScrollbar = True
                streamer = IO.File.OpenText(dirlog & "\DL-IMA-PUSH.log")
                Me.ListBox1.Items.Clear()
                While Not streamer.EndOfStream
                    ' Legge riga per riga e passa la stringa alla ListBox
                    Me.ListBox1.Items.Add(streamer.ReadLine)
    
                End While
    
                streamer.Close()
                streamer.Dispose()
                Call TwitterFind()
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try

    Domanda:
    come modifico la funzione per fargli caricare solo le righe che per esempio iniziano con la data del giorno? ossia dovrei inserire nel ciclo una condizione con InStr per filtrare prima il contenuto e poi caricarlo??

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.