Logger

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Do4KGT.

    Guten Abend zusammen,
    Da ich neu bin möchte ich mich gleich Vorstellen.
    Mein Name ist Tobias und ich bin Funkamateur und schreibe mir gerade ein Logger Programm.
    Da ich manchmal nur auf eine GSM verbindung zurückgreifen kann und meine vorhanden Programme eine zu große Bandbreite benötigen.
    Es geht eigentlich darum das ich von einem Server Informationen bekomme mit Frequenzen und Uhrzeit und Rufzeichen.
    Mein Programm verbindet auch schon zum Server und ich kann alles in der Listbox mit lesen.
    Jetzt wollte ich dies aber alles in einer Textdatei abspeichern damit ich mit einem anderen Programm auf die Textdatei zugreifen kann.

    Ich habe folgenden verwendet

    VB.NET-Quellcode

    1. Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
    2. Dim sav As New SaveFileDialog
    3. sav.Filter = "textdatei|*.txt"
    4. If sav.ShowDialog = Windows.Forms.DialogResult.OK Then
    5. Dim text As String = "telnet.txt"
    6. For Each Litem As String In ListBox1.Items
    7. text &= vbCrLf & Litem
    8. Next
    9. IO.File.WriteAllText(sav.FileName, text)
    10. End If
    11. End Sub


    Allerdings muss ich da immer neu abspeichern.
    Kann man es so lösen das wenn ein neuer Eintrag kommt dieser direkt in die Textdatei geschrieben wird???

    Vielen dank für eure Hilfe.
    Definire in der class einen String filename.

    VB.NET-Quellcode

    1. Dim sav As New SaveFileDialog sav.Filter = "textdatei|*.txt"
    2. If Filename = Nothing Then
    3. If sav.ShowDialog = Windows.Forms.DialogResult.OK Then
    4. Dim text As String = "telnet.txt"
    5. filename = sav.FileName
    6. End If
    7. end if
    8. For Each Litem As String In ListBox1.Items
    9. text &= vbCrLf & Litem
    10. Next
    11. IO.File.WriteAllText(filename, text)

    mfg kj4
    Hallo KJ4

    erst mal danke für deine Hilfe

    Also er schreibt langsam. Aber nur wenn ich in die Listbox Klicke,

    Aber das Programm soll selbstständig schreiben. Denn es läuft nur im Hintergrund mit.

    Das ganze sieht dann in der Textdatei so aus
    DB0SUE Logger DO4KGT
    login: do4kgt
    Hello Tobias, this is DB0SUE-7 in Kiel
    running DXSpider V1.55 build 0.82
    *Echoing is currently disabled, set/echo to enable
    Cluster: 392 nodes, 165 local / 4696 total users Max users 6668 Uptime 432 03:24
    DB0SUE-7>
    DX de PA0O: 1812.6 VY2ZM huge signal 100w wkd 2123Z JO33
    login: do4kgt
    Hello Tobias, this is DB0SUE-7 in Kiel
    running DXSpider V1.55 build 0.82
    *Echoing is currently disabled, set/echo to enable
    Cluster: 392 nodes, 165 local / 4696 total users Max users 6668 Uptime 432 03:24
    DB0SUE-7>
    DX de PA0O: 1812.6 VY2ZM huge signal 100w wkd 2123Z JO33
    DX de KC4EOG: 28430.0 K7ZOX FM05HI<ES>DN17 Double Hop E 2124Z
    DX de S57W: 1878.0 S59AA 2124Z JN76
    DX de KD8LCD: 14323.0 W8WRK 1916-radio relay special event 2124Z EM79


    Es sollte aber so aussehen.
    Login: do4kgt
    Hello Tobias, this is DB0SUE-7 in Kiel
    running DXSpider V1.55 build 0.82
    *Echoing is currently disabled, set/echo to enable
    Cluster: 392 nodes, 165 local / 4696 total users Max users 6668 Uptime 432 03:24
    DB0SUE-7>
    DX de PA0O: 1812.6 VY2ZM huge signal 100w wkd 2123Z JO33
    DX de KC4EOG: 28430.0 K7ZOX FM05HI<ES>DN17 Double Hop E 2124Z
    DX de S57W: 1878.0 S59AA 2124Z JN76
    DX de KD8LCD: 14323.0 W8WRK 1916-radio relay special event 2124Z EM79
    +
    +
    +
    +
    +
    bis unendlich

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Do4KGT“ ()

    Hallo Tobias,
    kann ich mal ein paar Fragen stellen:

    - rein aus Interesse: wie greifst Du auf den Server zu ?
    - gibt es einen Grund warum Du in eine Listbox loggst ? Waäre eine Richtextbox mit ihren Möglichkieten farbig zu schreiben nicht besser ?
    - warum machst Du das Sichern in ein File im Listbox.SelectedIndexChanged Event , wenn es doch automatisch im Hintergrund mitlaufen soll ?
    - steht in der Listbox nur die letzte Info drin oder auch alle Infos der letzten Zeit ?

    Wie ich es mir zusammenreime, möchtest Du dass die Info schon beim Ermitteln gleich weggesichert wird. Dann solltest Du es auch dort tun und nicht in einem Listbox Event.
    Hallo Kangaroo

    Also ich Verbinde den Logger mit eine WebClient
    Die Adresse ist DB0SUE.de:8000
    Listbox habe ich genommen weil ich seit Gestern Abend erst mit Visual Basic arbeite und noch nicht alles Kenne.

    Also wenn mein Logger einen Neuen Eintrag mitschreibt dann soll dieser nur in der Text datei hinzufügt werden und das am besten Direkt.

    Er soll nicht den ganzen Text wieder neu abspeichern so wie er es momentan macht.

    Do4KGT schrieb:

    Also ich Verbinde den Logger mit eine WebClient

    Also loggst Du vermutlich in regelmässigen Abständen per Timer ? Dann schreib den Text sauber mit einem Streamwriter weg :

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim WithEvents logTimer As New Timer With {.Interval = 60 * 1000}
    3. Dim fileName As String = "Logger.Txt"
    4. Dim logWriter As IO.StreamWriter
    5. ' form schliesst
    6. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    7. ' immer nette Idee den stream sauber zu schliessen
    8. logWriter.Close()
    9. End Sub
    10. ' form Load
    11. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    12. ' Timer starten
    13. logTimer.Start()
    14. ' file zum schreiben öffnen: autoflush schreibt sofort alles in das File
    15. logWriter = New IO.StreamWriter(fileName) With {.AutoFlush = True}
    16. End Sub
    17. ' Timer event
    18. Private Sub logTimer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles logTimer.Tick
    19. ' webClient holt Text .....
    20. Dim text= ....
    21. ' wegschreiben in File
    22. logWriter.WriteLine(Text)
    23. End Sub
    24. End Class
    Überall wo ich fragen stelle wird sich geprügelt.
    Habt euch doch einfach Lieb :thumbup:
    So also ich hab den Code jetzt eingefügt.

    Allerdings muss ich jetzt noch die Verbindung

    VB.NET-Quellcode

    1. Private Sub logTimer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles logTimer.Tick
    2. ' webClient holt Text .....
    3. Dim text= .... <-----------------------------------------------
    4. ' wegschreiben in File
    5. logWriter.WriteLine(Text)
    6. End Sub
    7. End Class


    Zur Listbox herstellen und genau da liegt jetzt mein Problem. Sorry ich hab leider erst am Samstag angefangen damit zu arbeiten. Bei mir ist noch vieles unklar. Aber ich gelobe Besserung.
    Wie füllst du denn aktuell deine Listbox?
    Immer wenn du ein neues Item in die Listbox schreibst, müsstest du mit dem Streamwriter einfach den gleichen Text per writeLine in die Textdatei schreiben.

    VB.NET-Quellcode

    1. logWriter.WriteLine(Text)
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Also ich schreib mal den Kompletten Code einfach damit auch nix aus dem zusammenhang gezogen wird oder ich es vielleicht Falsch beschreibe.

    Allerdings hätte ich da noch eine Sacke. Ich habe den Intervall auf 5 secunden gestellt da der Server unregelmäßig Daten an mich schickt und ich brauch relativ Schnell die Aktuellen Daten. Daher wäre es schön wenn er erst schreibt wenn ein neuer Datensatz kommt. Ist das möglich?


    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.IO
    3. Public Class Form1
    4. Dim WithEvents logTimer As New Timer With {.Interval = 5 * 1000}
    5. Dim fileName As String = "Telnet.Txt"
    6. Dim logWriter As IO.StreamWriter
    7. Private stream As NetworkStream
    8. Private streamw As StreamWriter
    9. Private streamr As StreamReader
    10. Private client As New TcpClient
    11. Private t As New Threading.Thread(AddressOf Listen)
    12. Dim R As Object
    13. Private Delegate Sub DAddItem(ByVal s As String)
    14. Private nick As String = "Do4KGT"
    15. Private Sub AddItem(ByVal s As String)
    16. ListBox1.Items.Add(s)
    17. End Sub
    18. Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    19. Try
    20. client.Connect("DB0SUE.de", 8000) ' hier die ip des servers eintragen.
    21. ' da dieser beim testen wohl lokal läuft, hier die loopback-ip 127.0.0.1.
    22. If client.Connected Then
    23. stream = client.GetStream
    24. streamw = New StreamWriter(stream)
    25. streamr = New StreamReader(stream)
    26. streamw.WriteLine(nick) ' das ist optional.
    27. streamw.Flush()
    28. t.Start()
    29. Else
    30. MessageBox.Show("Verbindung zum Server nicht möglich!")
    31. Application.Exit()
    32. End If
    33. Catch ex As Exception
    34. MessageBox.Show("Verbindung zum Server nicht möglich!")
    35. Application.Exit()
    36. End Try
    37. End Sub
    38. Private Sub Listen()
    39. While client.Connected
    40. Try
    41. Me.Invoke(New DAddItem(AddressOf AddItem), streamr.ReadLine)
    42. Catch
    43. MessageBox.Show("Verbindung zum Server nicht möglich!")
    44. Application.Exit()
    45. End Try
    46. End While
    47. End Sub
    48. Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    49. nick = InputBox("Rufzeichen: ", "Namen festlegen", "DO4KGT")
    50. End Sub
    51. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    52. For x = 0 To 5
    53. If x = 5 Then
    54. End ' Abbrechen der Programmausführung
    55. End If
    56. Next
    57. End Sub
    58. ' form schliesst
    59. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    60. ' immer nette Idee den stream sauber zu schliessen
    61. logWriter.Close()
    62. End Sub
    63. ' form Load
    64. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    65. ' Timer starten
    66. logTimer.Start()
    67. ' file zum schreiben öffnen: autoflush schreibt sofort alles in das File
    68. logWriter = New IO.StreamWriter(fileName) With {.AutoFlush = True}
    69. End Sub
    70. ' Timer event
    71. Private Sub logTimer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles logTimer.Tick
    72. ' webClient holt Text .....
    73. Dim text = "...."
    74. ' wegschreiben in File
    75. logWriter.WriteLine(Text)
    76. End Sub
    77. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Do4KGT“ ()

    Do4KGT schrieb:

    Allerdings hätte ich da noch eine Sacke. Ich habe den Intervall auf 5 secunden gestellt da der Server unregelmäßig Daten an mich schickt und ich brauch relativ Schnell die Aktuellen Daten. Daher wäre es schön wenn er erst schreibt wenn ein neuer Datensatz kommt. Ist das möglich?

    Wenn Du direkt auf den Stream gehst, so ist der Timer absolut unnötig. Ich hab mal Deinen Code schnell etwas angepasst , so dass er sowohl in ein File loggt als auch die Listbox befüllt.

    Die Initialisierung findet nun vollständig im Form.Shown() Event statt, alle offenen Streams werden im Form.Closing Event geschlossen. Ich gehe davon aus dass Du Visual Studio 2010 hast (??), so dass das Invoken ohne Delegaten sondern über anonyme Methode etwas simpler ausfällt.

    "Angepasster Code"

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Net.Sockets
    3. Public Class Form1
    4. ' User data
    5. Private nick As String = "Do4KGT"
    6. ' net client
    7. Private client As New TcpClient
    8. Private clientStream As NetworkStream
    9. Private clientReader As StreamReader
    10. Private clientWriter As StreamWriter
    11. ' file output
    12. Private fileName As String = "Telnet.Txt"
    13. Private logWriter As StreamWriter
    14. ' threading
    15. Private listenThread As New Threading.Thread(AddressOf Listen)
    16. ' event: Form wird angezeigt
    17. Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    18. ' Nick eingeben
    19. nick = InputBox("Rufzeichen: ", "Namen festlegen", nick)
    20. ' log öffnen
    21. logWriter = New StreamWriter(fileName) With {.AutoFlush = True}
    22. ' client connect
    23. Try
    24. client.Connect("DB0SUE.de", 8000) ' hier die ip des servers eintragen.
    25. ' stream holen
    26. clientStream = client.GetStream
    27. ' Nick schreiben
    28. clientWriter = New StreamWriter(clientStream)
    29. clientWriter.WriteLine(nick) ' das ist optional.
    30. clientWriter.Flush()
    31. ' reader stream holen
    32. clientReader = New StreamReader(clientStream)
    33. ' thread starten
    34. listenThread = New Threading.Thread(AddressOf Listen) With {.IsBackground = True}
    35. listenThread.Start()
    36. Catch ex As Exception
    37. MessageBox.Show("Verbindung zum Server nicht möglich!")
    38. Application.Exit
    39. End Try
    40. End Sub
    41. ' eigentliche Verarbeitung: lauscht auf neuen input
    42. Private Sub Listen()
    43. Try
    44. While client.Connected
    45. Dim input = clientReader.ReadLine
    46. ' log schreiben
    47. logWriter.WriteLine(input)
    48. ' Listbox item hinzufügen (invoke)
    49. Me.Invoke(Sub() ListBox1.Items.Add(input))
    50. End While
    51. Catch ex As Exception
    52. ' verbindung abgerissen
    53. MessageBox.Show("Verbindung zum Server nicht möglich!")
    54. Finally
    55. ' application sauber schliessen
    56. Application.Exit
    57. End Try
    58. End Sub
    59. ' event: form schliesst
    60. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    61. ' thread schliessen
    62. If listenThread IsNot Nothing AndAlso listenThread.IsAlive Then listenThread.Abort()
    63. ' alle streams sauber schliessen
    64. If logWriter IsNot Nothing Then logWriter.Close()
    65. If clientReader IsNot Nothing Then clientReader.Close()
    66. If clientWriter IsNot Nothing Then clientWriter.Close()
    67. If clientStream IsNot Nothing Then clientStream.Close()
    68. End Sub
    69. End Class


    Laut Code gibt es wie gesagt keinen Grund für eine Listbox, daher eher eine Textbox oder eine Richtextbox (formatierbar, Highlighting) verwenden. Du willst auch weiterhin die Inputbox am Anfang, obwohl es nur um Deinen eigenen Nick geht ?

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Kangaroo“ ()

    Vielen Dank Kangaroo

    Das ist genau so wie ich es mir vorstelle.
    Also ich habe die Listbox einfach genommen weil es für mich das einfachste war um die Daten vom Server mit zu Lesen.

    Das reicht auch für meine Wünsche und ich bin damit soweit Glücklich.

    Aber noch mal vielen Dank