paraneus
Goto Top

Mittels Skript Servername aus Logfile lesen

Hallo Zusammen

Ich habe folgendes Problem:

Ich muss mittels Skript den Servername sowie die Webapp aus dem jeweiligen Logfile lesen und dieses mit den erhaltenen Informationen umbenennen.

Beispiel:
Vorher Nachher
u_ex150605.log u_ex150605-Srvname-Webapp.log

Ausserdem müssten im Log alle User verändert werden:

Beispiel:
Vorher Nachher
global\xyzabc XYZ

Dafür habe ich bereits ein RegEx erstellt:
Conditions: global\\([a-zA-Z0-9]{3})[a-zA-Z0-9]*
Output: $1:1

Wie kann ich diesen RegEx implementieren?

Leider habe ich keine Ahnung von Skripten und weiss auch nicht welche Skriptingsprache sich dafür eignet. :'(

Könnt ihr mir helfen?

Ich verwende das Logformat W3C (IIS).

Content-Key: 274005

Url: https://administrator.de/contentid/274005

Printed on: April 23, 2024 at 09:04 o'clock

Mitglied: 114757
114757 Jun 08, 2015 updated at 08:05:15 (UTC)
Goto Top
mit Powershell ein Einzeiler z.B.
(gc 'c:\u_ex150605.log') -replace 'global\\([a-zA-Z0-9]{3})[a-zA-Z0-9]*','$1' | out-file 'c:\u_ex150605-Srvname-Webapp.log'  
Gruß jodel32
Member: Paraneus
Paraneus Jun 08, 2015 at 08:07:40 (UTC)
Goto Top
Hallo Jodel32

Danke für deine Hilfe. face-smile

Die Infos Srvname und Webapps müssen aber erst aus dem Logfile gelesen werden um den Namen zu generieren.
Wenn im Logfile steht, dass der Server z.B. ABC heisst und die Webapp XYZ sollte am ende das Logfile wie folgt heissen: u_ex150605-ABC-XYZ.log'.

LG Paraneus
Mitglied: 114757
114757 Jun 08, 2015 updated at 08:19:54 (UTC)
Goto Top
Die Infos Srvname und Webapps müssen aber erst aus dem Logfile gelesen werden um den Namen zu generieren.
Uups hatte ich vollkommen übersehen, sorry. Muss ich mir nachher erst mal ein Logfile dafür ansehen, wo die Infos stehen ... Oder du postest mal eine Ausschnitt deines Logs mit den gewünschten Infos. das lässt sich ja dann ebenfalls mit REGEX auslesen.
Member: Paraneus
Paraneus Jun 08, 2015 at 08:30:22 (UTC)
Goto Top
Hier mal einen Ausschnitt.
Rot = Server
Grün = Webapp
Orange = User


#Software: Microsoft Internet Information Services 8.0
#Version: 1.0
#Date: 2015-06-04 22:00:03
#Fields: date time s-sitename s-computername s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs-version cs(User-Agent) cs(Cookie) cs(Referer) cs-host sc-status sc-substatus sc-win32-status sc-bytes cs-bytes time-taken
2015-06-04 22:00:03 W3SVC1774025212 SRV22502 10.7.33.20 POST /_vti_bin/client.svc/ProcessQuery - 80 0#.w|global\wvzabz 10.115.110.69 HTTP/1.1 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+6.0;+Trident/5.0;+SLCC1;+.NET+CLR+2.0.50727;+.NET+CLR+3.0.30729;+.NET+CLR+3.5.30729;+InfoPath.2;+.NET4.0C;+.NET4.0E) ASP.NET_SessionId=ay4zzddochlf2bz14khfuyi5;+0c37852b34d0418e91c62ac25af4be5bdbcd0df8d5d54dd9b013d8e8faefffdbi%3A0%23%2Ew%7Cglobal%5Cwvzabz=0;+WSS_FullScreenMode=false http://mein.intranet.de/MeineStartseite.aspx mein.intranet.de 200 0 0 1656 1697 343
Member: colinardo
colinardo Jun 08, 2015 updated at 08:58:05 (UTC)
Goto Top
Hallo paraneus,
machts du so. Du kannst damit gleich einen ganzen Ordner mit LOG-Dateien verarbeiten. Den Ausgabe-Pfad für die neuen Log-Dateien gibst du in der zweiten Zeile an und in der ersten den Pfad zu den Original-Logdateien.
Die URL (Domainteil) der Webseite im Regex der Zeile 6 natürlich noch anpassen.
$pathLogIN = 'C:\logfiles'  
$outpath = 'C:\temp\out'  
gci $pathLogIN -Filter '*.log' | %{  
    $content = gc $_.FullName | out-string
    $server = [regex]::match($content,'(?im)^\d{4}-\d{2}-\d{2} [^\s]+ [^\s]+ ([^\s]+)').Groups[1].Value  
    $app = [regex]::match($content,'(?i)http://mein\.intranet\.de/(.*?).aspx').Groups[1].Value  
    $content -replace 'global\\([a-zA-Z0-9]{3})[a-zA-Z0-9]*','$1' | out-file "$outpath\$($_.BaseName)-$server-$app$($_.Extension)"  
}
Grüße Uwe
Member: Paraneus
Paraneus Jun 08, 2015 at 09:11:46 (UTC)
Goto Top
Vielen Danke Uwe für deine super Hilfe. face-smile

Nun habe ich das Problem, dass ich nur Logfiles kopieren soll, welche im Outpath noch nicht vorhanden sind. Also eine Art If not exist copy.

LG Paraneus
Member: colinardo
Solution colinardo Jun 08, 2015 updated at 11:41:33 (UTC)
Goto Top
Zitat von @Paraneus:
Nun habe ich das Problem, dass ich nur Logfiles kopieren soll, welche im Outpath noch nicht vorhanden sind. Also eine Art If not exist copy.
Kein Problem, mit einer zusätzlichen IF-Abfrage die überprüft ob das File noch nicht existiert (Zeilen 7-10):
$pathLogIN = 'C:\logfiles'  
$outpath = 'C:\temp\out'  
gci $pathLogIN -Filter '*.log' | %{  
    $content = gc $_.FullName | out-string
    $server = [regex]::match($content,'(?im)^\d{4}-\d{2}-\d{2} [^\s]+ [^\s]+ ([^\s]+)').Groups[1].Value  
    $app = [regex]::match($content,'(?i)http://mein\.intranet\.de/(.*?).aspx').Groups[1].Value  
    $outfile = "$outpath\$($_.BaseName)-$server-$app$($_.Extension)"  
    if (!(Test-Path $outfile)){
       $content -replace 'global\\([a-zA-Z0-9]{3})[a-zA-Z0-9]*','$1' | out-file $outfile  
   }
}
Member: Paraneus
Paraneus Jun 08, 2015 at 11:46:23 (UTC)
Goto Top
Vielen Dank für deine rasche und super Hilfe, Uwe! face-smile

Noch eine kurze Frage:
Weisst du wie ich mit RegEx bei meiner Auswahl die Gross-/Kleinschreibung regeln kann.

z.B. Suche ich in einem Logfile das Wort "kollaboration", im Logfile wird alles klein geschrieben, aber ich möchte dieses Wort im Logname und zwar so, dass der Buchstabe "K" gross angezeigt wird.

Ich habe es mit \p{Upper} versucht, jedoch dient diese Funktion nur für das Suchen der Auswahl.

LG Paraneus
Member: colinardo
colinardo Jun 08, 2015 updated at 11:50:49 (UTC)
Goto Top
aber ich möchte dieses Wort im Logname und zwar so, dass der Buchstabe "K" gross angezeigt wird.
? Du willst es im Logfile durch einen Großbuchstaben ersetzen oder nur für die Verwendung im Dateiname ändern ?
Member: Paraneus
Paraneus Jun 08, 2015 at 11:52:04 (UTC)
Goto Top
? Du willst es im Logfile durch einen Großbuchstaben ersetzen oder nur für die Verwendung im Dateiname
ändern ?

Nur für den Dateiname.
Member: colinardo
colinardo Jun 08, 2015 updated at 11:55:52 (UTC)
Goto Top
Beispiel
'kollaboration' -replace '(k)(ollaboration)','K$2'
oder
$name = 'kollaboration'  
$name = $name.Substring(0,1).ToUpper() + $name.Substring(1)
$name
Member: Paraneus
Paraneus Jun 08, 2015 at 12:01:59 (UTC)
Goto Top
Wo füge ich den das hinein bei:

gci $pathLogIN -Filter '*.log' | %{   
    $content = gc $_.FullName | out-string 
    $server = [regex]::match($content,'(?im)^\d{4}-\d{2}-\d{2} [^\s]+ [^\s]+ ([^\s]+)').Groups[1].Value   
    $app = [regex]::match($content,'(kollaboration|MeineStartseite|spstd)').Groups[1].Value   
    $outfile = "$outpath\$($_.BaseName)-$server-$app$($_.Extension)"  

    if (!(Test-Path $outfile)){ 
       $content -replace 'global\\([a-zA-Z0-9]{3})[a-zA-Z0-9]*','$1' | out-file $outfile   
   } 
}

Sorry, habe keine Ahnung davon face-sad
Member: colinardo
Solution colinardo Jun 08, 2015 updated at 12:39:25 (UTC)
Goto Top
gci $pathLogIN -Filter '*.log' | %{   
    $content = gc $_.FullName | out-string 
    $server = [regex]::match($content,'(?im)^\d{4}-\d{2}-\d{2} [^\s]+ [^\s]+ ([^\s]+)').Groups[1].Value   
    $app = [regex]::match($content,'(kollaboration|MeineStartseite|spstd)').Groups[1].Value  
    $app = $app.Substring(0,1).ToUpper() + $app.Substring(1)
    $outfile = "$outpath\$($_.BaseName)-$server-$app$($_.Extension)"  

    if (!(Test-Path $outfile)){ 
       $content -replace 'global\\([a-zA-Z0-9]{3})[a-zA-Z0-9]*','$1' | out-file $outfile   
   } 
}
Member: colinardo
Solution colinardo Jun 08, 2015 updated at 12:39:26 (UTC)
Goto Top
Noch ein wichtiger Hinweis: Wenn du mit dem Regex-.NET Objekt ([regex]::match()) ein Matching machst ist das erst mal Case-Sensitive. Wenn du das nicht willst musst dem Regex ein (?i) vorne anstellen, dann wird egal ob Groß oder Kleinschreibung gematcht !
Member: Paraneus
Paraneus Jun 08, 2015 at 12:39:13 (UTC)
Goto Top
Supi, hat funktioneirt! :D
Vielen Dank face-smile