none
Log schneller auswerten, Daten in Variable oder Array schreiben und darin suchen RRS feed

  • Frage

  • hallo zusammen,

    ich überlegen div. Variante um Exchange Logdateien schneller auszuwerten.

    get-messagetrackinglog ist ok solange man nur 1 User auswertet, da bei 30 Logfile jedes File nur 1x gelesen wird. Hat man jedoch 100 User werden für jeden User 30x die Logs gelesen. Ich denke das ginge besser und schneller zb mit Import-csv oder get-content wenn man ohnehin alle Benutzer auswerten möchte, da ich dann gleiche jede Zeile lesen muss.

    gibt es eine Möglichkeit, dass ich während des Imports wenn ich eine Zeile auswerte diesen User und TotalByte in eine Variable/tabellen/array (was man am besten so in Powershell machen würde) schreiben und wenn der gleiche User in weiteren Logs wieder vorkommt möchte ich die zusätzlichen Totalbyte bei ihm in der Variabler/Tabelle/ oder Array hinzufügen.

    man muss es sich wie bei einer Datenbank vorstellen. Dort würde man in einer zweite Tabelle die User ablegen und mit Index versehen und braucht dann in dieser zweiten Tabelle nur mehr 100 User durchsuchen. Das ist viel effizienter. Ich kenne es selbst von SQL oder MS-Access so. 

    die zweite Tabelle könnte ich auch in Powershell (wie in einer Datenbank bereits vorbelegen um es noch schneller zu machen), da es ohnehin nur Domain User sind.

    würde mich über Ideen und Anregungen freuen. Vielleicht ist auch Powershell das falsche Werkzeug.


    Chris

    Mittwoch, 1. Februar 2017 17:13

Antworten

Alle Antworten

  • Moin,

    Du kannst ja mit

    $log = Get-MessageTrackingLog -Server SERVERA
    $log += Get-MessageTrackingLog -Server SERVERB
    # usw.

    alle Logs in eine Variable einlesen und dann mit geeigneten where-Klauseln filtern.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    • Als Antwort markiert -- Chris -- Donnerstag, 2. Februar 2017 15:08
    Mittwoch, 1. Februar 2017 18:20
  • danke für die Anregung.

    Werde ich mir morgen gleich einmal ansehen. Ich hoffe bei 1 Monat Logfiles sprenge ich nicht das Limit der Variablen. Daher bisher meine Überlegung nur bestimmten Felder die interessant sind auslesen und auszuwerten.

    Bei Exchange 2016 wird es einfacher da alle Server alle Logs haben und man dann nur ein Get-MessageTrackingLog benötigt.

    Das mit dem where bzw. mit dem Auswerten wird noch eine Herausforderung. Ich glaube ohne Überleitung an eine DB wird's auf Dauer nicht vernünftig gehen.


    Chris

    Mittwoch, 1. Februar 2017 18:43
  • Daher bisher meine Überlegung nur bestimmten Felder die interessant sind auslesen und auszuwerten.


    Das kannst Du ja mit Select machen ;-)

    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Mittwoch, 1. Februar 2017 18:56
  • Werde ich mir morgen gleich einmal ansehen. Ich hoffe bei 1 Monat Logfiles sprenge ich nicht das Limit der Variablen.

    da musst Du noch -ResultSize Unlimited verwenden. Und nein, ich glaube nicht, dass Du da ans Limit kommst ;-)

    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Mittwoch, 1. Februar 2017 19:06
  • habe heute noch etwas getestet und wollte die Erkenntnis hier noch darlegen

    ein weiteres Problem ist die Unterscheidung zwischen gesendete und empfange. Der Parameter -EventId {RECEIVE -or DELIVER} wird leider nicht akzeptiert, was das ganze sicher schneller machen würde.

    $Gesendet = Get-MessageTrackingLog -resultsize unlimited -Start '01/01/2017' -end '01/31/2017' -EventId {RECEIVE -or DELIVER}
        $Empfangen = Get-MessageTrackingLog -resultsize unlimited -Start $DatumVon -end $DatumBis  -recipient $User.PrimarySmtpAddress -EventId DELIVER


    dieser Code brauchte ca. 6 Stunden.

    # Alle Mailboxen ermitteln
    $MailBoxen = get-mailbox -ResultSize Unlimited | sort name
    
    # für alle Mailboxen Anzahl der gesendeten und empfangenen Mails ermitteln
    foreach($User in $Mailboxen)
    {
    
    	$Gesendet = Get-MessageTrackingLog -resultsize unlimited -Start '01/01/2017' -end '01/31/2017' -EventId RECEIVE
        $Empfangen = Get-MessageTrackingLog -resultsize unlimited -Start $DatumVon -end $DatumBis  -recipient $User.PrimarySmtpAddress -EventId DELIVER
    
    
            $MailStatistik = $Gesendet.Count.ToString() + "," + $Empfangen.Count.ToString() + "," + $Datumvonk + "," + $DatumBisk + "," + $User.SamAccountName + "," + $User.Name #+ "`r`n"
            $MailStatistik | out-file -filepath $OutFileMailStatistik -Append
    }
    

    so habe ich es auch schon getestet

    Get-ChildItem c:\logs\MSGTRK[0-9]*
    
    $a
    $startime = date
    $startime
    
    $header = "datetime","clientip","clienthostname","serverip","serverhostname","sourcecontext","connectorid","source","eventid","internalmessageid","messageid","networkmessageid","recipientaddress","recipientstatus","totalbytes","recipientcount","relatedrecipientaddress","reference","messagesubject","senderaddress","returnpath","messageinfo","directionality","tenantid","originalclientip","originalserverip","customdata","transporttraffictype","logid","schemaversion"
    Import-Csv "c:\logs\test2.log" -Delimiter "," -Header $header | Select-Object -skip 5
    
    cls
    foreach($b in $a)
    {
    
           $ImportFile = Import-Csv $b.fullname -Delimiter "," -header $header | Select-Object -First 20
    }
    

    generell denke ich es sind zu viele Daten und die Auswertung dauert einfach zu lange. Vielleicht überlege ich noch einmal eine Variante nur für ein paar bestimmte Mailboxen.


    Chris

    Donnerstag, 2. Februar 2017 15:02
  • Hallo Chris,

    ich nutzte seit einiger Zeit nachfolgendes Script:

    WizBang Exchange Message Tracker 2.0

    wenn ich das über 4 Server und ca. 4000 Postfächer für eine Woche laufe lasse rennt das Script ca. eine Stunde.

    Um alle meine Server auf einmal zu scannen habe ich die Zeile 109 geändert in:

    get-exchangeserver | Get-MessageTrackingLog -ResultSize Unlimited -Start $dtQueryDT -End $dtQueryDTf  | where {($_.Recipients -notlike "HealthMailbox*") -and ($_.Recipients -notlike "IMCEAE*")}| ForEach-Object{ 
    

    und um alle Messages zu exportieren habe ich auf den Karteireiter 4 "Tracking Data Raw" noch eine Funktione eingebaut:

    function ExportAllMessage{
    
    $exAllFileName = new-object System.Windows.Forms.saveFileDialog
    $exAllFileName.DefaultExt = "csv"
    $exAllFileName.Filter = "csv files (*.csv)|*.csv"
    $exAllFileName.InitialDirectory = "c:\temp"
    $exAllFileName.Showhelp = $true
    $exAllFileName.ShowDialog()
    if ($exAllFileName.FileName -ne ""){
    
        $ssTable | Export-cSV  $exAllFileName.FileName -UseCulture -NoTypeInformation
        }
    }

    dafür dann noch eine Button zur Auslösung der Funktion:

    # Add Export Button
    $exButton4 = new-object System.Windows.Forms.Button
    $exButton4.Location = new-object System.Drawing.Size(130,700)
    $exButton4.Size = new-object System.Drawing.Size(120,20)
    $exButton4.Text = "Export All Message"
    #$$exButton4.Enabled = $false
    $exButton4.Add_Click({ExportAllMessage})
    $tab3.controls.Add($exButton4)

    Vielleicht hilft dir das ja

    Grüße
    Klaus

    Freitag, 3. Februar 2017 08:13
  • schaut cool und interssant aus. Danke für den Tipp.

    Hast du schon 2016er Exchange Server? Ich habe herausgefunden, dass alle Log auf unseren beiden Servern ident sind. Ein sinnvolles Feature von 2016. D.h. man braucht (in deinem Fall) nicht mehr alle 4 Server durchsuchen.


    Chris

    Freitag, 3. Februar 2017 11:17
  • Hallo Chris,

    2016 habe ich gerade im Test mit einer Handvoll Usern. Deinen Tipp werde ich dann mal überprüfen wenn wir mit dem Umzug fertig sind.

    Klaus

    Freitag, 3. Februar 2017 11:33