Doso 77 Geschrieben 9. Juli 2015 Melden Teilen Geschrieben 9. Juli 2015 Wir produzieren auf einem System am Tag ca. 300 MB Logfiles. Damit ich diese Dateien zur Fehleranalyse und Statistik länger aufheben darf, habe ich die Vorgabe die IP-Adressen in den Dateien zu anonymisieren. Es sollen dabei die letzten beiden Blöcke von IPv4 Adressen weggeschnitten werden. Aus 123.111.231.251 soll also 123.111.0.0 werden. Ich habe mich nun mit verschiedenen Varianten mit Powershell an dem Problem versucht. Ich bekomme zwar das gewünschte Ergebnis, aber ist die Laufzeit extrem mies. Weit über 30 Minuten Laufzeit, und auch Speicherbedarf jensweits von gut und böse. Jemand eine Idee wie man sowas geschickt skripten könnte? Kann auch gerne eine andere Skriptsprache sein, ich habe es halt mit Powershell versucht weil ich das am besten kann. Eine Zeile im Logfile sieht so aus: 123.111.231.251 - 4bTQHsdvUwrMOXa [09/Jul/2015:22:45:37 +0100] ... weitere Daten " - " ist im Logfile eindeutig, man kann das also ggf. zum aufteilen von Strings verwenden. Hier ein Auszug aus einem Versuch mit Powershell. $lines = get-content $logfile foreach ($line in $lines){ $splitedline = $line -split " - " $ip = $splitedline[0] $rest = $splitedline[1] $ip = $ip.split(".") $ip[2] = "0" $ip[3] = "0" $ip = $ip -join '.' $line = $ip + ' - ' + $rest $line | out-file $targetfile -append -encoding "ASCII"} Zitieren Link zu diesem Kommentar
Nobbyaushb 1.471 Geschrieben 9. Juli 2015 Melden Teilen Geschrieben 9. Juli 2015 Moin, stellt sich mir die Frage, wozu das gut sein soll. Werden die Logs extern ausgewertet? Wenn ich die - aus welchen Gründen auch immer - archiviere, will ich ja auch wissen, wer Source und Target war. ;) Zitieren Link zu diesem Kommentar
Doso 77 Geschrieben 9. Juli 2015 Autor Melden Teilen Geschrieben 9. Juli 2015 Ist ein Proxyserver. Muss leider die IP Adresse erst mal loggen, um dann Missbrauch nachverfolgen zu können, diese Logfiles darf ich aber dann nur 2 Wochen aufheben. Da kommen dann im Logfile dahinter noch die Zieladresse, Ergebnissecode, UserAgent und so Krams, das ist das interessante. Die Quelle, also die IP, ist mir bei diesen Auswertungen dann Schnuppe, ich hätte aber gerne mehr als 2 Wochen. Also entsprechend IP anonymisieren, Logfiles länger aufheben und dann Auswertungen machen. Zitieren Link zu diesem Kommentar
NeMiX 76 Geschrieben 9. Juli 2015 Melden Teilen Geschrieben 9. Juli 2015 Evtl. kann dir ein Perlscript mit Regex helfen. Bei einem älteren Arbeitgeber hatten wir die selbe Anforderung für einen Squid Proxy, das hat unser Linux Mensch mit einem 5 Zeiler in Perl per Cronjob gelöst (soweit ich mich erinnere). Durchlaufzeit war uns aber egal, lief einmal nachts auf der Proxy VM wo es keinen gestört hat. Kann also sein, dass du ähnliche schlechte Ergebnisse bekommst. Zitieren Link zu diesem Kommentar
Dukel 454 Geschrieben 10. Juli 2015 Melden Teilen Geschrieben 10. Juli 2015 Statt out-file -append kannst du set-file oder add-file nutzen. Get-content kannst du mit -ReadCount 1 ergänzen, damit dies schneller in einem rutsch eingelesen wird. Get-content und foreach kannst du zusammenfassen: foreach($foo in (get-content ...)) Dann liesst du nicht die 300 mb zwei mal. (einmal beim Get-content, einmal beim foreach). Damit sollte das Script schneller sein. Wenn es noch zu langsam ist musst du dies profilen. Zitieren Link zu diesem Kommentar
daabm 1.354 Geschrieben 10. Juli 2015 Melden Teilen Geschrieben 10. Juli 2015 Und als Hinweis zum Speicherverbrauch: http://powershell.org/wp/2013/10/21/why-get-content-aint-yer-friend/ oder http://stackoverflow.com/questions/4192072/how-to-process-a-file-in-powershell-line-by-line-as-a-stream Der StreamReader ist das bessere Objekt zum zeilenweisen Lesen :) Zitieren Link zu diesem Kommentar
Doso 77 Geschrieben 18. Juli 2015 Autor Melden Teilen Geschrieben 18. Juli 2015 Hatte das schonmal direkt mit der Pipeline probiert, nur kam dann am Ende nix bei raus. Die Zieldatei blieb leer. Habe mir das nochmal angeschaut, ich weis zwar nicht so ganz warum, aber es brauchte noch ein tostring(). Die Laufzeit ist jetzt schon mal von 30 Minuten auf knapp 10 Minuten runter und der Speicherbedarf bewegt sich nicht mehr im GB Bereich sondern nur noch wenige MB. Get-Content $logfile | ForEach-Object { $splitedline = $_ -split " - " $ip = $splitedline[0] $rest = $splitedline[1] $ip = $ip.split(".") $ip[2] = "0" $ip[3] = "0" $ip = $ip -join '.' $_ = $ip + ' - ' + $rest $_.tostring() } | Out-File $targetfile -encoding "ASCII" Zitieren Link zu diesem Kommentar
blub 115 Geschrieben 18. Juli 2015 Melden Teilen Geschrieben 18. Juli 2015 Hallo, Array-Operationen wie Split / Join sind generell relativ aufwändig, Vielleicht geht es so etwas schneller: blub Set-StrictMode -Version "2.0" Clear-Host $IP = "192.168.33.132" Function Anonymize-IP{ Param($Ip) $Ip = ($IP -as [Net.IPAddress]) $Bits = $Ip.GetAddressBytes() $Ip1 = $Bits[0] $Ip2 = $Bits[1] #$Ip3 = $Bits[2] #$Ip4 = $Bits[3] $AnonymIP = "$Ip1.$Ip2.0.0" Return $AnonymIP } $NewIP = Anonymize-IP $Ip $NewIP 1 Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.