Probleem met parsen van log file (Regex een optie?)

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Dutchmania
  • Registratie: November 2008
  • Laatst online: 20:34
Ik run al een tijdje een TS3 server en het leek mij leuk om een keer wat statistieken te bekijken.
De server houdt vanaf het begin log files bij en mijn idee is om deze te parsen en te analyseren dmv een c# programma (Visual Studio). In deze log files staan namelijk alle connect/disconnect activiteit.

De belangrijkste activiteiten uit de log files zijn:
code:
1
2
2017-05-10 22:13:40.323554|INFO    |VirtualServerBase|  1| client connected '<Username>'(id:347) from <IP>:<Port>
2017-05-10 22:13:56.112414|INFO    |VirtualServerBase|  1| client disconnected '<Username>'(id:347) reason 'reasonmsg=leaving'


De velden bevatten altijd dezelfde info en ik kan perfect splitten op de '|'.

Het probleem is dat de naam van de client vrij gekozen kan worden en dus ook de delimiter kan bevatten ( '|' ) of andere tekens (dus ook een single quote).


Wat ik heb geprobeerd is:
String.Split() [Link]
Splitten op '|' werkt perfect totdat ik deze delimiter in de username zet. Dan split die uiteraard ook daarop.

TextFieldParser [Link]
Deze heeft de optie om een delimiter in quotes over te slaan (HasFieldsEnclosedInQuotes), maar deze lijkt alleen te werken als deze in double quotes staat en niet zoals in het voorbeeld single quotes.

Ik heb even gekeken en ga zeker nog even kijken naar Regex. Dit zou mogelijk moeten zijn maar omdat dit vrij nieuw voor me is kom ik nog niet echt lekker op weg.


Wie weet de oplossing voor mij of kan mij op de goede weg zetten?
...

Alle reacties


Acties:
  • 0 Henk 'm!

  • _Garu_
  • Registratie: Juni 2014
  • Laatst online: 28-12-2024
Waarom splits je niet in drie delen:
1. Voor user name
2. Username - voorafgaand aan id
3. Na id

Misschien iets meer code, maar structuur lijkt zich ervoor te lenen

Acties:
  • 0 Henk 'm!

  • henk1994
  • Registratie: November 2013
  • Laatst online: 07-10 19:43
Je hebt 5 stukken die gesplit zijn met een | ? En in de eerste vier komt die sws niet voor?

Dan kun je toch een split uitvoeren en als je array lengte meer dan 5 is kun je die elementen weer samenvoegen?

Acties:
  • 0 Henk 'm!

  • michiel_
  • Registratie: Juli 2005
  • Niet online
Ben niet zo thuis in C#, maar TextFieldParser heeft een Delimiters (string[]) property, kan je daar de "|" niet in zetten?

Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
Er van uitgaande dat de | niet voorkomt in de eerste velden zou je zonder problemen .split("|", maxsplit=4) (of iets in die richting) moeten kunnen gebruiken. Daarmee heb je dan het blok
client connected '<Username>'(id:347) from <IP>:<Port>
los te pakken.

Regex is altijd een optie, maar wordt snel lastig om te debuggen, dus probeer ze beperkt te houden. In dit geval zou ik er voor kiezen om de berichttypes uit te splitsen, en dan pas een regex te gebruiken, dus bv.
code:
1
2
3
4
if message.startswith("client connected"):
   match = re.match(r"^client connected '(?P<username>.*?)'\(id:(?P<id>\d+)\) from (?P<ip>[\d\.]+):(?P<port>\d+)$", message)
   # of, als je alleen de username wilt opvangen
   match = re.match(r"^client connected '(.*?)'\(id:\d+\) from [\d\.]+:\d+$", message)


omdat per berichttype de precieze vorm goed bekend is. Maargoed, je ziet al dat vanwege het opvangen van de verschillende elementen de regex al weer vrij complex wordt.

Acties:
  • 0 Henk 'm!

  • johnkeates
  • Registratie: Februari 2008
  • Laatst online: 04-07 16:30
Je hebt toch alleen de eerste vier pipes nodig, daarna kan je de rest negeren.

Acties:
  • 0 Henk 'm!

  • eric.1
  • Registratie: Juli 2014
  • Laatst online: 18:29
Technisch lijkt me dit niet zo'n probleem. Met regex en/of splitting moet je dat nagenoeg in elke taal kunnen ;).

Heb je er trouwens wel over nagedacht of het opslaan en analyseren van die data wel is toegestaan op de manier zoals jij dat wilt? Zowel Nicknames als IP-adressen worden als persoonsgegevens beschouwd. Die mag je voor noodzakelijke doeleinden natuurlijk opslaan en gebruiken (bijhouden sessies, beveiliging etc), maar leukweg analyseren omdat het kan lijkt me niet technisch noodzakelijk - dan zul je voor zover ik weet specifiek toestemming moeten vragen ... of je moet er een reden hebben die bijzonder zwaarwegend is 8-).

Acties:
  • 0 Henk 'm!

  • Dutchmania
  • Registratie: November 2008
  • Laatst online: 20:34
Zo, dat zijn al veel reacties! Bedankt!
Ik kan helaas pas vanavond pas testen maar het idee om de eerste vier velden te pakken en alles tot "(id:...)" zien als username had ik niet aan gedacht en lijkt de beste oplossing. (Hoe simpel kan het zijn)
eric.1 schreef op zaterdag 27 mei 2017 @ 14:25:
Technisch lijkt me dit niet zo'n probleem. Met regex en/of splitting moet je dat nagenoeg in elke taal kunnen ;).

Heb je er trouwens wel over nagedacht of het opslaan en analyseren van die data wel is toegestaan op de manier zoals jij dat wilt? Zowel Nicknames als IP-adressen worden als persoonsgegevens beschouwd. Die mag je voor noodzakelijke doeleinden natuurlijk opslaan en gebruiken (bijhouden sessies, beveiliging etc), maar leukweg analyseren omdat het kan lijkt me niet technisch noodzakelijk - dan zul je voor zover ik weet specifiek toestemming moeten vragen ... of je moet er een reden hebben die bijzonder zwaarwegend is 8-).
Ik heb hier zeker over nagedacht en ik vind dat je ook een goed punt hebt.
Het idee is ook om dit puur als interne info te gebruiken. Door middel van deze info kan achterhaald worden hoe lang iemand totaal online is geweest, welke usernames er zijn gemaakt op een id enz. Deze info zal nooit openbaar te vinden zijn.
De log files worden door de TS3 server zelf aangemaakt, dit is geen extra plugin/functionaliteit.

Acties:
  • 0 Henk 'm!

  • 8088
  • Registratie: December 2000
  • Niet online

8088

NaN

Zo doet iemand 't met Python.

Do you seek to engage in or have you ever engaged in terrorist activities, espionage, sabotage, or genocide?


Acties:
  • 0 Henk 'm!

  • JustAnotherDev
  • Registratie: Augustus 2004
  • Laatst online: 03-10 20:53
Misschien overkill maar is LogStash + Kibana niet iets.
Uitermate geschikt voor het analyseren van logfiles en zeker niet verkeerd om kennis van te hebben.

https://www.elastic.co/products/logstash

Acties:
  • 0 Henk 'm!

  • TweakMDS
  • Registratie: Mei 2002
  • Laatst online: 30-09 09:17
Logstash kwam ook meteen bij me op, maar lijkt me ook overkill, omdat je het dan meteen over een product hebt, en niet iets in je code. Dit kan ook wel interessant zijn:
https://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader

Overigens vind ik het al jaren een gammele implementatie dat het quote character van texfieldparser hardcoded op double-quote staat.

Regex kan een optie zijn, maar als je GB's aan data gaat verwerken is dat traag.

Acties:
  • 0 Henk 'm!

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

Log Parser is ook een optie.

Acties:
  • 0 Henk 'm!

  • johnkeates
  • Registratie: Februari 2008
  • Laatst online: 04-07 16:30
Of gebruik een random stream reader die de buffer uitpoept op elke pipe behalve bij de laatste pipe.

Acties:
  • 0 Henk 'm!

Verwijderd

Heb je al eens naar de TS SDK gekeken?
Ze bieden ook een C# wrapper aan.

Misschien dat er functionaliteit in zit die jij kunt gebruiken?
Pagina: 1