Die Auswertung vom Windows Event Log auf Fehler und Muster darin, ist mit dem Event Viewer nur begrenzt möglich und sehr mühsam. Eine einfache Alternative ist der Export der Events mit der Powershell zu CSV und der Import mit Analyse in Power BI.

Datensammeln

Das Datensammeln erfolgt über ein Powershell-Skript. Es wird pro Server eine CSV-Datei angelegt. Es wird pro Server getrennt, damit auch unterschiedliche User, mit unterschiedlichen Berechtigungen, das Skript ausführen können und die Ergebnisse nicht verfälschen.

param (
    [string] $Path, # Path to a file share
    [string[]] $Servers # List of servers to collect the logs from
)

foreach ( $server in $servers ) {
    Get-EventLog -LogName 'System' -ComputerName $server -EntryType Error |
    Select-Object TimeGenerated, MachineName, Index, EntryType, UserName, Source, Message, Category |
    ConvertTo-Csv -NoTypeInformation |
    Out-File "$Path\windows-error-log.$server.csv"
}

Datenmodell

In Power BI müssen die Daten eingelesen werden.
Dazu wird ein Parameter LogFolderPath definiert.

Dazu wird eine M-Funktion LoadCsv definiert, die eine einzelne CSV-Datei einliest.

let Func = (FolderPath, Name) =>
    let 
        File = Files{
            [#"Folder Path"=FolderPath,Name=Name]
        }[Content],
        #"Imported CSV" = Csv.Document(
            File, [
                Delimiter=",", 
                Columns=8, 
                Encoding=1200, 
                QuoteStyle=QuoteStyle.None
            ]
        ),
        #"Promoted Headers" = Table.PromoteHeaders(
            #"Imported CSV", [PromoteAllScalars=true]
        )
    in
        #"Promoted Headers"
in Func

Dann wird ein Dataset Files definiert, das die CSV-Dateien im Verzeichnis auflistet, das im Parameter definiert ist.

let
    Source = Folder.Files(LogFolderPath),
    #"Filtered Rows" = Table.SelectRows(
        Source, 
        each [Extension] = ".csv"
    )
in
    #"Filtered Rows"

Dann wird ein Dataset Log definiert, das die Dateien einliest und verknüpft.

let
    Source = Files,
    #"Invoked Custom Function" = Table.AddColumn(
        Source, "Table", each LoadCsv([Folder Path], [Name])
    ),
    #"Removed Other Columns" = Table.SelectColumns(
        #"Invoked Custom Function",{"Table"}
    ),
    #"Expanded Table" = Table.ExpandTableColumn(
        #"Removed Other Columns", "Table", {
            "TimeGenerated", "MachineName", "Index", "EntryType", 
            "UserName", "Source", "Message", "Category"
        }, {
            "TimeGenerated", "MachineName", "Index", "EntryType", 
            "UserName", "Source", "Message", "Category"
        }
    ),
    #"Changed Type" = Table.TransformColumnTypes(
        #"Expanded Table",{
            {"TimeGenerated", type datetime}, 
            {"MachineName", type text}, 
            {"Index", type text}, 
            {"EntryType", type text}, 
            {"UserName", type text}, 
            {"Source", type text}, 
            {"Message", type text}, 
            {"Category", type text}
        }, "en-US"
    ),
    #"Replaced Errors" = Table.ReplaceErrorValues(
        #"Changed Type", {{"TimeGenerated", null}}),
    #"Filtered Rows" = Table.SelectRows(
        #"Replaced Errors", each ([TimeGenerated] <> null)
    )
in
    #"Filtered Rows"

Das Ergebnis ist ein Dataset mit allen Error-Events von allen Servern der Liste.

Visualisierung

Die Visualisierung erfolgt dann ebenfalls in Power BI. Z.B. mit einem Kuchendiagramm je Server, Log-Source, User und Message zur Filterung.
Ein Zeitstrahl, mit Zeitpunkt auf der X-Achse, hilft zeitliche Muster zu erkennen, wie hier eine wöchentliche Häufung.
Die Details können in einer Tabelle angezeigt werden.

report-1

0 Antworten

Hinterlassen Sie einen Kommentar

Wollen Sie an der Diskussion teilnehmen?
Wir freuen uns über Ihren Beitrag!

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.