Reading console.log
#1
Hey,
Since i'm on a posting spree anyway, I have another question, although it has to do with plugin development and c#, it's for MW3 and i need help so that's why this is here.

My question:
The console.log contains a lot of information that can be quite useful to be able to read in a plugin, and i know how to read a text file, but i can't seem to find a way to resume reading at the location reading was stopped.
I have spent some time googling and all the results i could find were and implementation that depended on knowing the number of characters that are written in a certain time, and i obviously can't know that for sure. Is there a way to read the logfile, close it, and later open it again and continue reading from the place you last closed it?

I guess you could always read the whole file and discard the data that has already been read, but that seem's quite inefficient
-Bonemind
Reply

#2
Easy.

When I developed rCrayon - SL I was faced with the same issue.

The best solution was to record the last time stamp of the file, then compare it against the first line being read.. if its newer or > than the last timestamp recorded, proceed.

Also, used linux timestamp as it was much easier to compare than the timestamp that
is the default.

Really simple actually.
crAyon makes no warranty with respect to documents or other information available from this place, assumes no legal liability or responsibility whatsoever for the accuracy, completeness, or usefulness of any such information, and does not represent that its use would not infringe privately owned rights. crAyon disclaims all warranties, express and implied, including the warranties of merchantability and fitness for a particular purpose.
Reply

#3
(02-03-2012, 18:39)deadcrayon Wrote: Easy.

When I developed rCrayon - SL I was faced with the same issue.

The best solution was to record the last time stamp of the file, then compare it against the first line being read.. if its newer or > than the last timestamp recorded, proceed.

Also, used linux timestamp as it was much easier to compare than the timestamp that
is the default.

Really simple actually.

But this would still translate to iterating through the whole file and starting to read at the correct timestamp. Or am i misunderstanding?

-Bonemind
Reply

#4
Code:
Imports System.Text Imports MySql.Data.MySqlClient Imports System.IO Public Class Form1 Inherits System.Windows.Forms.Form Private Function GetFileSize(ByVal MyFilePath As String) As Long Dim MyFile As New FileInfo(MyFilePath) Dim FileSize As Long = MyFile.Length Return FileSize End Function Private Function Find(ByVal StrSearchString As String) As Boolean Try DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect Dim intcount As Integer = 0 For Each Row As DataGridViewRow In DataGridView1.Rows If DataGridView1.Rows(intcount).Cells(0).Value.ToString = StrSearchString Then DataGridView1.Rows(intcount).Selected = True Find = True End If intcount += 1 Next Row Find = False Catch ex As Exception Debug.WriteLine("HERE IT IS") End Try End Function Private Function GetLogs() Timer2.Enabled = False Dim x As Integer Dim n As Integer n = 0 x = 0 If GetFileSize("C:\rcrayon\games_mp.log") < 50 Then log.Text = "Log Delay..." TASSMySQL.Delay(1) log.Text = "Fetching..." Shell("C:\rcrayon\bin\get_logs.bat", AppWinStyle.Hide, True) Timer2.Enabled = True Exit Function Else Dim fsize As Long fsize = GetFileSize("C:\rcrayon\games_mp.log") log.Text = "Parsing:" & fsize ParseLogs() End If End Function Private Function ParseLogs() Dim p As Integer Dim q As Integer Dim r As Integer Dim db_id As String Dim x As Integer Dim k As Integer Dim d As Integer Dim e As Integer Dim f As Integer Dim LR As String Dim LS As String Dim aSwitch As Array Me.Show() db_id = TASSMySQL.ReadFile("C:\rcrayon\logs\dbid.log") LR = TASSMySQL.readQuery("SELECT COUNT(*) FROM " + db_id) LS = TASSMySQL.readQuery("SELECT ts FROM " + db_id + " WHERE rid=" + LR) ListBox2.Items.Clear() ListBox2.Items.AddRange(System.IO.File.ReadAllLines("C:\rcrayon\games_mp.log")) log.Text = "Loaded: " & ListBox2.Items.Count k = 0 pb.Minimum = 1 pb.Maximum = ListBox2.Items.Count + 1 qBox.Items.Clear() Dim ParsedLine As Array Dim phpUrl As String Dim nospace As String Dim rep As String Dim rep2 As String Dim rep3 As String Dim rep4 As Integer Dim sConv As Integer For x = 0 To ListBox2.Items.Count - 1 Application.DoEvents() ParsedLine = Split(ListBox2.Items.Item(x), ";") nospace = LTrim(ParsedLine(0)) aSwitch = Split(nospace, " ") rep3 = Replace(aSwitch(0), ":", "") rep4 = Replace(LS, ":", "") TASSMySQL.WritelogFile(rep4 & " :: " & rep3) sConv = Val(rep3) If IsNumeric(rep3) = False Then GoTo SKIP If rep3 > rep4 Then Try Select Case aSwitch(1) Case "K" rep = Replace(ParsedLine(4), "'", "~") rep2 = Replace(ParsedLine(8), "'", "~") light.BackColor = Color.LimeGreen k = Val(k + 1) phpUrl = "INSERT IGNORE INTO " + db_id + " (rid, ts, aflag, vguid, vpos, vteam, vname, pguid, ppos, pteam, pname, pweapon, pdamage, ptype, hitmap, time, type) VALUES ('', '" + aSwitch(0) + "', '" + aSwitch(1) + "','" + ParsedLine(1) + "','" + ParsedLine(2) + "','" + ParsedLine(3) + "','" + rep + "', '" + ParsedLine(5) + "', '" + ParsedLine(6) + "', '" + ParsedLine(7) + "', '" + rep2 + "', '" + ParsedLine(9) + "', '" + ParsedLine(10) + "', '" + ParsedLine(11) + "', '" + ParsedLine(12) + "', CURRENT_TIMESTAMP, '1')" qBox.Items.Add(phpUrl) light.BackColor = Color.Black log.Text = "Parsing: Add! (K)" kills.Text = Val(kills.Text + 1) Case "D" rep = Replace(ParsedLine(4), "'", "~") rep2 = Replace(ParsedLine(8), "'", "~") phpUrl = "INSERT IGNORE INTO " + db_id + " (rid, ts, aflag, vguid, vpos, vteam, vname, pguid, ppos, pteam, pname, pweapon, pdamage, ptype, hitmap, time, type) VALUES ('', '" + aSwitch(0) + "', '" + aSwitch(1) + "','" + ParsedLine(1) + "','" + ParsedLine(2) + "','" + ParsedLine(3) + "','" + rep + "', '" + ParsedLine(5) + "', '" + ParsedLine(6) + "', '" + ParsedLine(7) + "', '" + rep2 + "', '" + ParsedLine(9) + "', '" + ParsedLine(10) + "', '" + ParsedLine(11) + "', '" + ParsedLine(12) + "', CURRENT_TIMESTAMP, '2')" qBox.Items.Add(phpUrl) log.Text = "Parsing: Add! (D)" d = damage.Text e = ParsedLine(10) f = Val(d + e) damage.Text = f '///////////// JOIN ///////////// Case "J" phpUrl = "INSERT IGNORE INTO " + db_id + " (rid, ts, aflag, vguid, vpos, vteam, vname, pguid, ppos, pteam, pname, pweapon, pdamage, ptype, hitmap, time, type) VALUES ('', '" + aSwitch(0) + "', '" + aSwitch(1) + "','" + ParsedLine(1) + "','" + ParsedLine(2) + "','" + ParsedLine(3) + "','', '', '', '', '', '', '', '', '', CURRENT_TIMESTAMP, '3')" qBox.Items.Add(phpUrl) My.Computer.FileSystem.WriteAllText("C:\rcrayon\php\" & ParsedLine(2) & ".php", "<?php include ('rcon_lib.php'); $server_ip = '" + My.Settings.rcon_ip + "'; $server_port = '" + My.Settings.rcon_port + "'; $server_pass = '" + My.Settings.rcon_pass + "'; $rcon = new BOrcon(); date_default_timezone_set('America/Chicago'); $today = date('H:i:s'); $rcon->connect($server_ip, $server_port, $server_pass); $rcon->rcon('tell " & ParsedLine(2) & " ^0Welcome: ^2" + ParsedLine(3) + " ^0|^2 type !coms for commands'); ?>", False) Shell("C:\rcrayon\bin\php.exe C:\rcrayon\php\" & ParsedLine(2) & ".php", AppWinStyle.Hide, True) My.Computer.FileSystem.DeleteFile("C:\rcrayon\php\" & ParsedLine(2) & ".php") log.Text = "Parsing: Add! (J)" '/////////////////////////////// Case "VD" phpUrl = "INSERT IGNORE INTO " + db_id + " (rid, ts, aflag, vguid, vpos, vteam, vname, pguid, ppos, pteam, pname, pweapon, pdamage, ptype, hitmap, time, type) VALUES ('', '" + aSwitch(0) + "', '" + aSwitch(1) + "','" + ParsedLine(1) + "','" + ParsedLine(2) + "','" + ParsedLine(3) + "','" + ParsedLine(4) + "', '" + ParsedLine(5) + "', '" + ParsedLine(6) + "', '" + ParsedLine(7) + "', '" + ParsedLine(8) + "', '" + ParsedLine(9) + "', '" + ParsedLine(10) + "', '" + ParsedLine(11) + "', '" + ParsedLine(12) + "', CURRENT_TIMESTAMP, '4')" qBox.Items.Add(phpUrl) log.Text = "Parsing: Add! (VD)" Case "say" phpUrl = "INSERT IGNORE INTO " + db_id + " (rid, ts, aflag, vguid, vpos, vteam, vname, pguid, ppos, pteam, pname, pweapon, pdamage, ptype, hitmap, time, type) VALUES ('', '" + aSwitch(0) + "', '" + aSwitch(1) + "','" + ParsedLine(1) + "','" + ParsedLine(2) + "','" + ParsedLine(3) + "','" + ParsedLine(4) + "', '', '', '', '', '', '', '', '', CURRENT_TIMESTAMP, '5')" qBox.Items.Add(phpUrl) log.Text = "Parsing: Add! (S)" Dim cmnd As Array cmnd = Split(ParsedLine(4), "!") Select Case cmnd(1) Case "rules" My.Computer.FileSystem.WriteAllText("C:\rcrayon\php\" & ParsedLine(2) & ".php", "<?php include ('rcon_lib.php'); $server_ip = '" + My.Settings.rcon_ip + "'; $server_port = '" + My.Settings.rcon_port + "'; $server_pass = '" + My.Settings.rcon_pass + "'; $rcon = new BOrcon(); date_default_timezone_set('America/Chicago'); $today = date('H:i:s'); $rcon->connect($server_ip, $server_port, $server_pass); $rcon->rcon('tell " & ParsedLine(2) & " ^2 No foul language ^0|^2 Play fair ^0|^2 Dont Cheat!'); $rcon->rcon('tell " & ParsedLine(2) & " ^2 You will not be warned^0,^2 only kicked^0.'); ?>", False) Shell("C:\rcrayon\bin\php.exe C:\rcrayon\php\" & ParsedLine(2) & ".php", AppWinStyle.Hide, True) My.Computer.FileSystem.DeleteFile("C:\rcrayon\php\" & ParsedLine(2) & ".php") Case "time" My.Computer.FileSystem.WriteAllText("C:\rcrayon\php\" & ParsedLine(2) & ".php", "<?php include ('rcon_lib.php'); $server_ip = '" + My.Settings.rcon_ip + "'; $server_port = '" + My.Settings.rcon_port + "'; $server_pass = '" + My.Settings.rcon_pass + "'; $rcon = new BOrcon(); date_default_timezone_set('America/Chicago'); $today = date('H:i:s'); $rcon->connect($server_ip, $server_port, $server_pass); $rcon->rcon('tell " & ParsedLine(2) & " ^0 Current Time: ^2'.$today.'');", False) Shell("C:\rcrayon\bin\php.exe C:\rcrayon\php\" & ParsedLine(2) & ".php", AppWinStyle.Hide, True) My.Computer.FileSystem.DeleteFile("C:\rcrayon\php\" & ParsedLine(2) & ".php") Case "coms" My.Computer.FileSystem.WriteAllText("C:\rcrayon\php\" & ParsedLine(2) & ".php", "<?php include ('rcon_lib.php'); $server_ip = '" + My.Settings.rcon_ip + "'; $server_port = '" + My.Settings.rcon_port + "'; $server_pass = '" + My.Settings.rcon_pass + "'; $rcon = new BOrcon(); date_default_timezone_set('America/Chicago'); $today = date('H:i:s'); $rcon->connect($server_ip, $server_port, $server_pass); $rcon->rcon('tell " & ParsedLine(2) & " ^2 !rules, !time, !coms, !about, !stats');", False) Shell("C:\rcrayon\bin\php.exe C:\rcrayon\php\" & ParsedLine(2) & ".php", AppWinStyle.Hide, True) My.Computer.FileSystem.DeleteFile("C:\rcrayon\php\" & ParsedLine(2) & ".php") Case "about" My.Computer.FileSystem.WriteAllText("C:\rcrayon\php\" & ParsedLine(2) & ".php", "<?php include ('rcon_lib.php'); $server_ip = '" + My.Settings.rcon_ip + "'; $server_port = '" + My.Settings.rcon_port + "'; $server_pass = '" + My.Settings.rcon_pass + "'; $rcon = new BOrcon(); date_default_timezone_set('America/Chicago'); $today = date('H:i:s'); $rcon->connect($server_ip, $server_port, $server_pass); $rcon->rcon('tell " & ParsedLine(2) & " ^2 rCrayon - SL [rcrayon.com]'); $rcon->rcon('tell " & ParsedLine(2) & " ^2 Version 2.4.11 | Beta');", False) Shell("C:\rcrayon\bin\php.exe C:\rcrayon\php\" & ParsedLine(2) & ".php", AppWinStyle.Hide, True) My.Computer.FileSystem.DeleteFile("C:\rcrayon\php\" & ParsedLine(2) & ".php") Case "stats" Dim guid As String Dim kills As Integer Dim deaths As Integer Dim ratio As Integer Dim rtotal As Integer guid = ParsedLine(1) kills = TASSMySQL.ReadQuery2("SELECT COUNT(pname) FROM " + db_id + " WHERE type='1' AND pguid='" + guid + "'") deaths = TASSMySQL.ReadQuery2("SELECT COUNT(vname) FROM " + db_id + " WHERE type='1' AND pguid='" + guid + "'") ratio = kills / deaths rtotal = Math.Round(ratio, 1) My.Computer.FileSystem.WriteAllText("C:\rcrayon\php\" & ParsedLine(2) & ".php", "<?php include ('rcon_lib.php'); $server_ip = '" + My.Settings.rcon_ip + "'; $server_port = '" + My.Settings.rcon_port + "'; $server_pass = '" + My.Settings.rcon_pass + "'; $rcon = new BOrcon(); date_default_timezone_set('America/Chicago'); $today = date('H:i:s'); $rcon->connect($server_ip, $server_port, $server_pass); $rcon->rcon('tell " & ParsedLine(2) & " ^0Server Totals: K - ^2 " & kills & " ^0 D - ^2 " & deaths & " ^0 KDR ^2" & rtotal & "^0'); $rcon->rcon('tell " & ParsedLine(2) & " ^0Stats by: ^2rCrayon.com');", False) Shell("C:\rcrayon\bin\php.exe C:\rcrayon\php\" & ParsedLine(2) & ".php", AppWinStyle.Hide, True) My.Computer.FileSystem.DeleteFile("C:\rcrayon\php\" & ParsedLine(2) & ".php") End Select Case Else End Select Catch ex As Exception End Try pb.Increment(+2) x = Val(x + 1) ticker.Text = x End If SKIP: Next x Dim n As Integer pb.Minimum = 1 pb.Maximum = qBox.Items.Count + 1 pb.Value = 1 For n = 0 To qBox.Items.Count - 1 Application.DoEvents() light.BackColor = Color.LightBlue light.BackColor = Color.LimeGreen TASSMySQL.writeQuery(qBox.Items.Item(n)) log.Text = "Insert: " & n & "/" & qBox.Items.Count - 1 pb.Increment(+1) light.BackColor = Color.Black Next qBox.Items.Clear() pb.Value = 1 My.Computer.FileSystem.WriteAllText("C:\rcrayon\games_mp.log", "", False) MySql.Data.MySqlClient.MySqlConnection.ClearAllPools() log.Text = "Parse Done." TASSMySQL.Delay(1) log.Text = "Sleeping: " & Timer4.Interval Timer4.Enabled = True End Function Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing Dim d As Integer = damage.Text Dim k As Integer = kills.Text My.Computer.FileSystem.WriteAllText("C:\rcrayon\logs\counters.log", k & ":" & d, False) End Sub Sub FinishedCountingEventHandler(ByVal Count As Integer) End Sub Private Sub ExitToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExitToolStripMenuItem.Click End End Sub Private Sub ConfigureToolStripMenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ConfigureToolStripMenuItem1.Click Me.Hide() Form2.Show() End Sub Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick Dim counter1 As New Count1() Dim Thread3 As New System.Threading.Thread(AddressOf counter1.Count) Dim Thread4 As New System.Threading.Thread(AddressOf counter1.Count) counter1.CountTo = 5 Thread3.Start() Thread4.Start() log.Text = "Fetching..." GetLogs() End Sub Private Sub Timer4_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer4.Tick Timer2.Enabled = True Timer4.Enabled = False End Sub Private Sub Timer3_Tick_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer3.Tick End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load LinkLabel1.Visible = False Dim counter1 As New Count1() Dim Thread1 As New System.Threading.Thread(AddressOf counter1.Count) Dim Thread2 As New System.Threading.Thread(AddressOf counter1.Count) Dim OhShit As New System.Threading.Thread(AddressOf counter1.Count) counter1.CountTo = 5 AddHandler counter1.FinishedCounting, AddressOf FinishedCountingEventHandler Dim dataSrc Dim db_key As String Dim csplit As Array Dim counters As String If My.Computer.FileSystem.FileExists("C:\rcrayon\logs\counters.log") = True Then counters = My.Computer.FileSystem.ReadAllText("C:\rcrayon\logs\counters.log") csplit = Split(counters, ":") kills.Text = csplit(0) damage.Text = csplit(1) End If log.Text = "Warming Up!" Me.Text = "rCrayon - SL" If My.Computer.FileSystem.FileExists("C:\rcrayon\1") = True Then TASSMySQL.TestConnection() Thread1.Start() Timer4.Interval = My.Settings.Fetch_Rate_ms db_key = TASSMySQL.ReadFile("C:\rcrayon\logs\dbid.log") dataSrc = TASSMySQL.FillForm("SELECT ts FROM " + db_key) DataGridView1.DataSource = dataSrc log.Text = "Online - Active" Me.Text = "rCrayon - SL (2.4.12) - Online (" + db_key + ")" LinkLabel1.Visible = True Dim spp As Array spp = Split(db_key, "_") LinkLabel1.Text = "http://rcrayon.com/clans/?id=" & spp(1) & "" If My.Computer.FileSystem.FileExists("C:\rcrayon\games_mp.log") = True Then Thread2.Start() Shell("C:\rcrayon\bin\get_logs.bat", AppWinStyle.Hide, True) If GetFileSize("C:\rcrayon\games_mp.log") > 50 Then Me.NotifyIcon1.BalloonTipTitle = "rCrayon - SL Beta" Me.NotifyIcon1.BalloonTipText = "We are fetching your logfile, please stand by..." Me.NotifyIcon1.BalloonTipIcon = ToolTipIcon.Info Me.NotifyIcon1.ShowBalloonTip(3) ' MsgBox("We found a log with entries, we will parse this before" + vbCrLf + "we contiue loading the application. Don't worry we" + vbCrLf + "have started additional threads, it should only take a minute...", vbInformation + vbOKOnly, "rCrayon - Friendly Reminder") Application.DoEvents() OhShit.Start() ListBox2.Items.AddRange(System.IO.File.ReadAllLines("C:\rcrayon\games_mp.log")) db_key = TASSMySQL.ReadFile("C:\rcrayon\logs\dbid.log") dataSrc = TASSMySQL.FillForm("SELECT ts FROM " + db_key) DataGridView1.DataSource = dataSrc DataGridView1.Refresh() ParseLogs() Else Timer2.Enabled = True End If End If End If If My.Computer.FileSystem.FileExists("C:\rcrayon\1") = False Then Form2.Show() End If End Sub Private Sub NotifyIcon1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles NotifyIcon1.MouseClick If Me.WindowState = FormWindowState.Minimized Then Me.Visible = True End If End Sub Private Sub NotifyIcon1_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles NotifyIcon1.MouseDoubleClick End Sub Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize If Me.WindowState = FormWindowState.Minimized Then Me.Visible = False End If End Sub Private Sub ListView1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListView1.SelectedIndexChanged End Sub End Class
crAyon makes no warranty with respect to documents or other information available from this place, assumes no legal liability or responsibility whatsoever for the accuracy, completeness, or usefulness of any such information, and does not represent that its use would not infringe privately owned rights. crAyon disclaims all warranties, express and implied, including the warranties of merchantability and fitness for a particular purpose.
Reply

#5
This might be useful
http://www.itsmods.com/forum/Thread-Rele...utput.html
Reply

#6
Quote:But this would still translate to iterating through the whole file and starting to read at the correct timestamp. Or am i misunderstanding?

-Bonemind

The file will have to be read if it's not kept in memory. The only other way to do it
is to remember / record line number of file.

However, the logfile would have to only ever be appended to and never modified or you
will lose the correct line numbering.

It's fast to just parse the timestamps out in memory and read them... try it.

You can parse 1000 lines in memory in about 0.01 seconds as these lines aren't very long.

As you can see I was parsing the mp.log and it is much thicker.

I've posted the source to the program here

It was too big to attach to this post. (sorry @d0h, @jariz, @everyone for external link).
crAyon makes no warranty with respect to documents or other information available from this place, assumes no legal liability or responsibility whatsoever for the accuracy, completeness, or usefulness of any such information, and does not represent that its use would not infringe privately owned rights. crAyon disclaims all warranties, express and implied, including the warranties of merchantability and fitness for a particular purpose.
Reply



Possibly Related Threads…
Thread Author Replies Views Last Post
  Help mod not reading .iwd files? hmann 4 6,040 10-13-2013, 20:14
Last Post: hmann
  Help MW3 (External) Console - TeknoMW3? Strazeeh 7 10,816 10-01-2013, 21:54
Last Post: DeHEnergY
  Help MW3 (External) Console - TeknoMW3? Strazeeh 2 5,878 09-30-2013, 19:19
Last Post: surtek
  [Request] MW2 EXTERNAL CONSOLE!!! thomiromi 4 7,717 09-26-2013, 18:02
Last Post: Rendflex
  console or server browser MW2 kerm007 1 4,994 08-30-2013, 21:52
Last Post: Nekochan
  [News] T6 Console [PC] zer0w 42 41,208 08-08-2013, 17:27
Last Post: Bandarigoda123
  Help GSC Reading Files?! Howl3r 11 11,194 07-30-2013, 04:00
Last Post: DidUknowiPwn
Wink Help MW3 Server Console Bandarigoda123 0 4,107 07-26-2013, 04:01
Last Post: Bandarigoda123
  Help Help in address console Bandarigoda123 2 4,586 07-20-2013, 15:46
Last Post: Bandarigoda123
  [Release] Black Ops 1 "External" Console barata 16 26,333 07-19-2013, 21:15
Last Post: Jakeyellis

Forum Jump:


Users browsing this thread:
1 Guest(s)

Forum Powered By MyBB, Theme by © 2002-2026 Melroy van den Berg.