Skip to content

Export-ErrorLogsSummary

Reporting: Summarizes Windows Event Log errors from the past N hours

#Requires -Version 5.1

[CmdletBinding()]
Param(
    [string[]]$ComputerName = @('localhost'),

    [int]$Hours = 24,

    [string[]]$LogName = @('System', 'Application'),

    [switch]$Summarize
)

Process {
    try {
        if ($Hours -le 0) {
            throw "Hours parameter must be a positive integer."
        }

        $startTime = (Get-Date).AddHours(-$Hours)
        $results = @()

        foreach ($computer in $ComputerName) {
            try {
                $filterHash = @{
                    LogName   = $LogName
                    Level     = @(1, 2) # 1 = Critical, 2 = Error
                    StartTime = $startTime
                }

                $events = Get-WinEvent -FilterHashtable $filterHash -ComputerName $computer -ErrorAction SilentlyContinue

                if ($null -eq $events) {
                    continue
                }

                foreach ($event in $events) {
                    $results += [PSCustomObject]@{
                        ComputerName     = $computer.ToUpper()
                        LogName          = $event.LogName
                        ProviderName     = $event.ProviderName
                        EventID          = $event.Id
                        LevelDisplayName = $event.LevelDisplayName
                        TimeCreated      = $event.TimeCreated
                        Message          = $event.Message.Trim()
                    }
                }
            }
            catch {
                Write-Warning "Failed to query event logs on computer '$computer': $_"
            }
        }

        if ($results.Count -eq 0) {
            Write-Verbose "No Critical or Error event logs found within the last $Hours hours."
            return
        }

        if ($Summarize) {
            # Group by Computer, Log, Source, and ID
            $grouped = $results | Group-Object ComputerName, LogName, ProviderName, EventID
            $summary = foreach ($g in $grouped) {
                # Extract the properties from group values
                $firstEvent = $g.Group[0]
                [PSCustomObject]@{
                    ComputerName = $firstEvent.ComputerName
                    LogName      = $firstEvent.LogName
                    Source       = $firstEvent.ProviderName
                    EventID      = $firstEvent.EventID
                    Severity     = $firstEvent.LevelDisplayName
                    Count        = $g.Count
                    SampleMessage= if ($firstEvent.Message.Length -gt 150) { $firstEvent.Message.Substring(0, 150) + "..." } else { $firstEvent.Message }
                }
            }
            Write-Output ($summary | Sort-Object Count -Descending)
        } else {
            Write-Output ($results | Sort-Object TimeCreated -Descending)
        }
    }
    catch {
        Write-Error $_
        throw
    }
}

One or more computers or IP addresses to query

Lookback duration in hours. Defaults to 24.

Target event logs to query. Defaults to System and Application.

Off

Group and count duplicate events by Source and EventID rather than returning individual events

An interactive directory of PowerShell scripts.