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.
Dein Kommentar
An Diskussion beteiligen?Hinterlasse uns Deinen Kommentar!