Last9

Windows Event Logs: Monitoring, Alerts, and Compliance

Learn how to monitor Windows Event Logs, set up alerts, and ensure compliance with proper log retention and archiving strategies.

Mar 4th, ‘25
Windows Event Logs: Monitoring, Alerts, and Compliance
See How Last9 Works

Unified observability for all your telemetry. Open standards. Simple pricing.

Talk to an Expert

Your Windows service stopped responding in production. The team needs answers, and the only clues are buried somewhere in the Application log. But that log has over 10,000 entries—most of them routine Info messages, generated in just the last two hours. What you need are the 3 Error events that explain what failed, when, and why.

Windows logs are detailed. They record almost everything that happens across the system: kernel events, service failures, authentication attempts, configuration changes. The challenge is knowing how to filter that volume of data fast—especially when you’re working against the clock.

This guide focuses on the production use of Windows logs. You’ll know how to filter events by type, source, or severity using PowerShell, recognize high-signal Event IDs, and build a setup that helps you monitor Windows logs at scale, without the overhead.

What Are Windows Event Logs?

The Windows event log is the system’s built-in source of truth. It captures operational data from the OS, services, and applications, everything from driver failures and service crashes to authentication attempts and policy changes. If something important happens on a Windows machine, it likely shows up in the event log.

Each entry in a Windows event log includes structured metadata: timestamp, event ID, severity level, source, and a human-readable message. Logs are grouped by categories like System, Application, and Security, so you can zero in on specific issues without wading through unrelated noise.

Even if you're running containerized workloads or deploying in the cloud, Windows logs still matter. Many CI/CD pipelines, hybrid infrastructure setups, and legacy services rely on Windows log data to troubleshoot failures that metrics or traces might miss.

If you’re building out observability for Windows systems, understanding how the event log works and how to extract and monitor the right data is a solid starting point.

💡
If you're running critical workloads on Windows Server, keeping an eye on performance metrics can save you from unexpected headaches—here’s a practical guide on Windows Server Monitoring.

Where You’ll Find Windows Event Logs

Windows event logs are stored as .evtx files in:

C:\Windows\System32\winevt\Logs

But you’re unlikely to inspect them manually. Most workflows rely on tools like Event Viewer or PowerShell to interact with the Windows log system more efficiently.

Use Event Viewer to Explore Logs

Event Viewer is the built-in GUI for reading Windows logs. You can open it by:

  • Pressing Win + R, typing eventvwr.msc, and hitting Enter
  • Or going to: Start → Administrative Tools → Event Viewer

The left panel groups Windows event logs into categories:

  • Application – Events from applications and services
  • Security – Login attempts, access control, and audit events
  • System – Kernel, driver, and OS-level events
  • Setup – Installation and update events
  • Forwarded Events – Logs collected from other machines

This structure helps isolate issues quickly. For example, you’ll find service crashes under Application, while authentication issues live in Security.

Run PowerShell to Query Windows Logs

For automated workflows or deeper analysis, PowerShell is more flexible:

# Show the latest 10 events from the System log
Get-EventLog -LogName System -Newest 10

# Show error-level Application events from the last 24 hours
Get-WinEvent -FilterHashtable @{
  LogName='Application'; Level=2; StartTime=(Get-Date).AddDays(-1)
}

# Filter Security log by event ID
Get-WinEvent -FilterHashtable @{
  LogName='Security'; ID=4624
}
⚠️ Use Get-WinEvent for production tasks. It supports more event log types, handles XML-based logs, and performs better than Get-EventLog, which is being phased out.

PowerShell gives you direct access to the Windows log pipeline, ideal for scripting alerts, exporting events, or plugging logs into a monitoring backend.

💡
If you're managing both Windows and Linux systems, this guide on Linux log file locations outlines where to find critical logs across distros, helpful when setting up unified monitoring across environments.

Essential Windows Log Types for Debugging Production Issues

The Windows log system tracks a lot, but not every log is equally useful for debugging or monitoring. These are the core Windows event logs that developers and operators typically rely on:

Application Log

This is where most software-level issues surface. If your web server throws an exception, your API gateway crashes, or your database connector fails silently, start here. Application logs record events generated by user-mode apps and services.

System Log

The system log reflects what's happening behind the scenes, driver failures, hardware errors, service start/stop activity, and other OS-level events. If a service didn’t start after a reboot, or a hardware dependency failed, this Windows event log helps track it down.

Security Log

Windows logs all security-related activity here: failed login attempts, privilege escalations, access control changes, and audit events. If you're responding to a suspected breach or just reviewing authentication issues, this is the log to inspect.

Custom Application Logs

Some applications, like SQL Server, IIS, or Exchange, write to their own named Windows logs. These avoid polluting the main Application log and allow for more targeted monitoring. You can view them in Event Viewer under their categories, or query them directly using PowerShell.

Tip: Use Get-WinEvent -ListLog * to list all available logs on a system, including app-specific ones.
💡
Understanding log levels can help you cut through the noise and catch issues before they escalate, here’s a useful guide on Log Levels: Answers to the Most Common Questions.

How to Analyze Windows Log Data

Windows Event Logs contain detailed system and application-level information, but without context, it's just noise. Here's how to parse what's important.

Event Structure

Each event entry includes structured metadata that helps with filtering, correlation, and root cause analysis:

Component Details
Level Severity of the event — Information, Warning, Error, or Critical
Date and Time Timestamp when the event was logged
Source Application, service, or component that generated the event
Event ID Numeric identifier for the event type
Task Category Subclassification provided by the source
Description Human-readable message (includes parameters or error codes, if any)

Common Event IDs

Some Event IDs show up frequently and are worth recognizing. Here’s a reference table for quick identification:

Event ID Description
4624 Successful user logon
4625 Failed logon attempt
7036 Service state change (started or stopped)
1074 User or process initiated system restart
6005 Event Log service startup
6006 Event Log service shutdown
41 System rebooted unexpectedly (Kernel-Power)
1001 Windows Error Reporting (WER) report logged

Practical Tips for Log Management

Once you're collecting logs, the next challenge is using them effectively. Here's how to turn all that noise into something useful in your workflow.

1. Filtering: Zero in on What Matters

The Event Viewer has basic filtering, but PowerShell gives you far more control. Example: finding all error-level events from a specific app in the last hour:

$oneHourAgo = (Get-Date).AddHours(-1)
Get-WinEvent -FilterHashtable @{
    LogName = 'Application'
    Level = 2  # Error
    StartTime = $oneHourAgo
    ProviderName = 'Your Application Name'
}

This helps you skip the GUI and go straight to actionable logs, especially during incident response.

2. Custom Views: Save Your Common Searches

If you're regularly hunting for the same types of logs, like failed logins or app crashes, create a custom view in Event Viewer:

  • Open Event Viewer
  • Click Create Custom View
  • Set filters like time range, log name, severity level, and source
  • Save it with a clear name like "Auth Failures" or "App Exceptions"

Consider it as a saved search that you can revisit whenever needed.

3. Log Forwarding: Centralize Everything

If you’re working with multiple Windows servers, setting up Windows Event Forwarding (WEF) helps you centralize logs to a single collector box.

On the collector server:

wecutil qc /q
  • Enables the Windows Event Collector service
  • /q skips confirmation prompts

On each source server:

winrm quickconfig
  • Configures Windows Remote Management (WinRM)
  • Starts the service and allows the machine to send logs remotely

Once this is in place, you’ll have one place to monitor and query logs from across your environment.

💡
Managing log retention effectively ensures you have the right data when you need it—without unnecessary storage costs. Here’s a practical guide on Log Retention.

How to Integrate Event Logs With Your DevOps Workflow

A Windows log doesn’t just belong in a postmortem. To make it useful, you need to bake it into your day-to-day workflow, before something breaks.

Here’s how to do that.

Monitor and Alert With the Right Tools

You’ve got a few options depending on your stack and how much control you want:

Last9 — Built for Observability at Scale

If you're managing Windows systems in production, logs are only useful when they connect to the bigger picture. Last9 provides a structured way to work with Windows logs alongside metrics and traces, no separate pipelines, no format mismatches.

  • Ingest Windows event logs natively using OpenTelemetry, with full support for log fields like EventID, Task Category, and User SID
  • Query logs, metrics, and traces in one place using PromQL-style expressions
  • Correlate log events with upstream or downstream service behavior, so failures aren't investigated in isolation
  • Track alerts through SLOs, not just thresholds, so you're responding to real impact, not every noisy warning

Last9 is designed to handle high-volume, high-cardinality telemetry, whether it’s from Windows services, infrastructure, or application-level instrumentation.

Last9 Review
Last9 Review

Windows Event Forwarding (WEF) – Native Log Aggregation

Built into Windows, WEF collects event logs from multiple machines and ships them to a central collector.

  • Uses Windows Remote Management (WinRM) for transport
  • Ideal for on-prem setups with no external log shipper
  • Lightweight and secure, but best suited for environments already running Active Directory
  • Set up event subscriptions to avoid collecting junk data

Azure Monitor – Cloud-Based Log Monitoring

If you're using Azure VMs or a hybrid infrastructure, Azure Monitor gives you centralized visibility.

  • Collects logs using the Log Analytics Agent
  • Uses Kusto Query Language (KQL) for filtering, alerting, and dashboarding
  • Integrates with Azure Security Center for threat detection
  • Good option when extending observability across both cloud and on-prem

Automate Responses to Repeated Failures

You can also use PowerShell to automate reactions to certain event patterns, like restarting a flaky service:

$failEvents = Get-WinEvent -FilterHashtable @{
    LogName = 'System'
    ID = 7031  # Service crashed unexpectedly
    ProviderName = 'Service Control Manager'
} -MaxEvents 5

if ($failEvents.Count -ge 3) {
    Restart-Service -Name "ProblemService" -Force
    Send-MailMessage -To "you@company.com" `
        -Subject "Service Restarted Automatically" `
        -Body "Service 'ProblemService' was restarted after 3+ failures."
}
  • 7031 is the event ID for an unexpected service termination
  • Script checks for 3+ failures, then restarts the service
  • Sends an alert so the incident isn’t missed
Tip: Combine this with Task Scheduler or a scheduled runbook in Azure Automation to make it part of your resilience strategy.

Integrate Windows Logs with Your Developer Tools

Once you’ve set up basic monitoring and filtering, the next step is to connect Windows logs with the tools your team already uses.

Here’s how you can plug log events into developer workflows, so alerts, checks, and actions happen automatically, without needing to open Event Viewer.

Send Critical Windows Events to Slack

You don’t need a full-blown logging system just to get alerted when a service crashes. A simple PowerShell script can watch for service failures and send a message to your team’s Slack channel:

# Monitor for service crashes and send alert to Slack
$webhook = "https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK"

$criticalEvents = Get-WinEvent -FilterHashtable @{
    LogName = 'System'
    ID = 7031
    StartTime = (Get-Date).AddMinutes(-5)
} -ErrorAction SilentlyContinue

if ($criticalEvents) {
    $message = @{
        text = "Service crash detected on $env:COMPUTERNAME"
        attachments = @(@{
            color = "danger"
            fields = @(@{
                title = "Event Details"
                value = $criticalEvents[0].Message
                short = $false
            })
        })
    } | ConvertTo-Json -Depth 3

    Invoke-RestMethod -Uri $webhook -Method Post -Body $message -ContentType 'application/json'
}

Use Task Scheduler to run this every few minutes in production environments.

Add Log Checks to GitHub Actions

If you deploy Windows workloads, you can verify service health as part of your CI/CD pipeline. This example uses GitHub Actions to check for system-level service failures after a deployment:

# .github/workflows/deployment-health-check.yml
name: Post-Deploy Health Check
on:
  deployment_status:
    types: [success]

jobs:
  health-check:
    runs-on: windows-latest
    steps:
      - name: Check for post-deployment failures
        run: |
          $failures = Get-WinEvent -FilterHashtable @{
            LogName = 'System'
            ID = 7031, 7034
            Level = 2, 3
            StartTime = (Get-Date).AddMinutes(-10)
          } -ErrorAction SilentlyContinue

          if ($failures) {
            echo "::error::Windows service failures detected"
            $failures | ForEach-Object { echo "::warning::$($_.Message)" }
            exit 1
          }

This stops broken deployments from moving forward and surfaces problems early.

Open GitHub Issues for High-Priority Events

You can also raise tickets automatically for recurring or high-severity errors. This example uses PowerShell to create a GitHub issue when a critical Windows event is detected:

function New-GitHubIssueFromEvent {
    param($Event, $RepoToken)

    $issueBody = @"
**Event ID:** $($Event.Id)
**Source:** $($Event.ProviderName)
**Time:** $($Event.TimeCreated)
**Server:** $env:COMPUTERNAME

**Details:**
$($Event.Message)
"@

    $issue = @{
        title = "Service failure on $($Event.ProviderName)"
        body = $issueBody
        labels = @("bug", "infrastructure", "windows")
    } | ConvertTo-Json

    Invoke-RestMethod -Uri "https://api.github.com/repos/your-org/your-repo/issues" `
        -Method Post -Body $issue -Headers @{ Authorization = "token $RepoToken" }
}

You can use this to track recurring issues and tie logs directly into incident or backlog workflows.

💡
Use Last9 MCP to bring production Windows logs, metrics, and traces into your local environment, so you can inspect real event data alongside your code and reproduce issues with full system context.

3 Common Windows Log Location Issues (and How to Fix Them)

Working with logs on Windows often starts with this simple question: Where are my logs?

But as you dig deeper, you may run into issues that are less about location and more about size, detail, or configuration. Here’s a breakdown of three common problems and how to troubleshoot each.

1. “I Can't Find My Logs”

If your logs aren't where they should be, or aren’t showing up at all, start with the essentials:

Check if the Event Log service is running

Use PowerShell to confirm the service is active:

Get-Service EventLog

If it's not running, restart it:

Restart-Service EventLog

Verify available disk space

Logs may silently stop being written if the system drive is full:

Get-Volume C

Look for SizeRemaining and clear space if necessary.

Inspect log retention and rotation settings

Windows may be configured to overwrite logs too quickly:

Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\EventLog\Application

Look for MaxSize and retention-related values. To increase log capacity:

Limit-EventLog -LogName Application -MaximumSize 2GB

2. “My Logs Are Too Big—or Too Small”

If logs are consuming too much space or not retaining enough history, you can adjust their maximum size.

Increase the log size (example: System log)

Limit-EventLog -LogName System -MaximumSize 2GB

View current log settings

Get-EventLog -List

This shows each log’s size, retention policy, and number of entries—helpful for tuning log size and cleanup intervals.

3. “My Logs Aren’t Detailed Enough”

By default, some services only emit basic operational logs. For deeper insight, enable debug or analytical channels.

Enable debug logging for a Windows service

wevtutil.exe sl Microsoft-Windows-YourService/Debug /e:true

Replace YourService with the actual provider name. This turns on a secondary debug channel, if available.

Enable analytical logging

Analytical logs are high-volume, low-level traces. To enable them:

wevtutil.exe set-log "Microsoft-Windows-YourService/Analytical" /enabled:true

You’ll often need to use Event Viewer > View > Show Analytic and Debug Logs to see them.

Use Eventvwr.msc for a GUI-driven view, but rely on PowerShell for repeatable checks and automation. Misconfigured logs can silently hinder diagnostics, especially on shared environments or production servers, so it's worth validating these settings periodically.

💡
If you want to see how logs are structured for efficient search and parsing, check out our post on log format standards (JSON, XML, key-value) for practical examples and considerations.

How to Retain Windows Event Logs Without Running Into Storage Problems

Retaining Windows event logs is all about meeting compliance requirements, supporting audits, detecting security incidents, and enabling forensic analysis. But keeping everything forever leads to another problem: storage bloat.

Here’s how to strike a balance between retention and efficiency, without losing critical data.

Back Up and Clear Logs Programmatically

Before clearing logs to free up space, always archive them.

# Export System log with timestamped filename
$logName = "System"
$timestamp = Get-Date -Format 'yyyyMMdd'
$backupPath = "C:\Backups\${logName}_$timestamp.evtx"

wevtutil.exe epl $logName $backupPath  # Back up the log
wevtutil.exe cl $logName               # Clear the log after backup

This ensures:

  • Logs are retained for audit purposes.
  • New logs can be written without hitting max log size limits.
  • Backups are timestamped for easy tracking.
Pro tip: Automate this script with Task Scheduler to run daily or weekly.

Long-Term Archiving for Compliance

If you're subject to regulations like HIPAA, PCI-DSS, or SOC 2, log retention isn’t optional. You’ll need structured, secure, and queryable storage for years of historical data.

Option 1: Use a SIEM System

Security Information and Event Management (SIEM) platforms like:

These tools ingest and index logs from multiple sources, including Windows event logs. They help with:

  • Real-time alerting and anomaly detection.
  • Long-term log storage with retention policies.
  • Audit trails and compliance-ready reporting.

Option 2: Archive to Azure Log Analytics

For hybrid or cloud-native infrastructure, Azure Monitor with Log Analytics is a solid choice.

Benefits:

  • Forward logs from on-prem or cloud-hosted Windows instances.
  • Store securely in Azure Storage with geo-redundancy.
  • Analyze with Kusto Query Language (KQL).
  • Set up alerts based on specific Windows log events or thresholds.
Azure also supports retention policies and can archive to cold storage for cost savings.

Automate Log Archival With PowerShell

If you’re managing logs at scale and not using a SIEM, automation becomes critical.

Example daily archival script:

$logs = @("System", "Application", "Security")
$backupRoot = "C:\Backups"

foreach ($log in $logs) {
    $file = "${backupRoot}\${log}_$(Get-Date -Format 'yyyyMMdd').evtx"
    wevtutil.exe epl $log $file
    wevtutil.exe cl $log
}

Schedule this via Task Scheduler or Group Policy to ensure consistency across environments.

Choose the Right Log Retention Policy

Every system and organization is different, but here’s what to evaluate when setting a policy:

Factor Consideration
Compliance How long does your industry require logs to be retained? (e.g., 1–7 years)
Storage Do you have space for uncompressed logs, or will you need compression or cold storage?
Security Are archived logs encrypted and access-controlled?
Searchability Can you retrieve logs quickly for an audit or incident review?

If logs are hard to access, they’re useless during a crisis. Prioritize formats and tools that make querying fast and reliable.

Windows Log Quick Reference

Essential Commands

# Last 10 errors from any log
Get-WinEvent -FilterHashtable @{Level=2; StartTime=(Get-Date).AddHours(-24)} -MaxEvents 10

# Service failures today  
Get-WinEvent -FilterHashtable @{LogName='System'; ID=7031; StartTime=(Get-Date).Date}

# Failed logins last hour
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625; StartTime=(Get-Date).AddHours(-1)}

# List all logs
Get-WinEvent -ListLog * | Select LogName, RecordCount

Critical Event IDs

ID Log Meaning
4625 Security Failed login
7031 System Service crashed
41 System Unexpected reboot
1001 Application App crash

Log Locations

Log PowerShell Name Path
System System C:\Windows\System32\winevt\Logs\System.evtx
Application Application C:\Windows\System32\winevt\Logs\Application.evtx
Security Security C:\Windows\System32\winevt\Logs\Security.evtx

Emergency Checks

# What caused last reboot?
Get-WinEvent -FilterHashtable @{LogName='System'; ID=1074,41} -MaxEvents 3

# Service won't start?
Get-WinEvent -FilterHashtable @{LogName='System'; ID=7000} -MaxEvents 5

# Recent app crashes?
Get-WinEvent -FilterHashtable @{LogName='Application'; ID=1000} -MaxEvents 5
💡
Making sense of SIEM logs can be tricky, but the right approach helps turn data into actionable insights—here’s a practical guide on SIEM Logs.

Conclusion

Effective Windows log analysis depends on more than just collecting events; it’s about turning them into answers quickly. That’s hard to do when you're switching between Event Viewer, dashboards, and CLI tools just to understand what failed, when, and why.

Manual correlation across logs, metrics, and traces often adds friction, especially when your Windows services run alongside distributed workloads.

Last9 simplifies this process:

  • Automatically connects log events with application traces and infrastructure metrics
  • Helps you track down the root cause, across systems, in one view
  • Keeps full log detail: EventID, Task Category, User SID, custom labels, without sampling
  • Supports log-based SLOs, so alerts reflect actual user impact, not just raw errors

Explore how Last9 handles Windows logs without agents or complex pipelines. Or book time with us to see how it fits into your stack.

💡
If you've any of your own Windows log tricks, join our Discord community and share with us – we're all learning together.

FAQs

How far back do Windows event logs go?

By default, Windows keeps logs until they reach their maximum size (typically 20MB for System and Application logs). When logs fill up, Windows overwrites the oldest events. You can adjust this with PowerShell:

# See current retention settings
Get-EventLog -List

# Increase size to prevent early overwriting
Limit-EventLog -LogName Application -MaximumSize 4GB

For critical systems, consider setting up log forwarding or scheduled archiving to preserve logs indefinitely.

Can I read Windows event logs without admin rights?

For most logs, you'll need administrative privileges. However, some applications write to logs that regular users can access. If you need to grant non-admin users access to specific logs:

# Grant read access to a user
wevtutil set-log Security /ca:'O:BAG:SYD:(A;;0x1;;;SY)(A;;0x1;;;BA)(A;;0x1;;;AU)(A;;0x1;;;YourDomain\YourUser)'

But be careful – security logs contain sensitive information.

How do I correlate events across multiple servers?

Your options include:

  • Set up Windows Event Forwarding to a central collector
  • Use Azure Monitor to aggregate logs in the cloud
  • Implement a third-party SIEM solution
  • Use PowerShell to query multiple servers:
Invoke-Command -ComputerName Server1, Server2, Server3 -ScriptBlock {
    Get-WinEvent -FilterHashtable @{LogName='System'; ID=1074} -MaxEvents 5
} | Select-Object PSComputerName, TimeCreated, ID, Message

Time synchronization is crucial here – make sure all servers use the same NTP source.

What's the difference between .evt and .evtx file formats?

  • .evt: Legacy format used in Windows XP/Server 2003
  • .evtx: Modern XML-based format used since Windows Vista/Server 2008

The newer .evtx format offers better performance, more detailed information, and larger log sizes. If you're dealing with older .evt files, use the Get-WinEvent cmdlet with the -Path parameter to read them.

Can I export logs for analysis in other tools?

Absolutely. Export options include:

# Export to XML
Get-WinEvent -LogName System -MaxEvents 100 | Export-Clixml -Path C:\Temp\events.xml

# Export to CSV
Get-WinEvent -LogName System -MaxEvents 100 | Select TimeCreated, ID, LevelDisplayName, Message | Export-Csv -Path C:\Temp\events.csv -NoTypeInformation

# Export raw EVTX
wevtutil epl System C:\Temp\system.evtx

Many analysis tools like Last9, ELK Stack, and Graylog can ingest these formats.

Authors
Anjali Udasi

Anjali Udasi

Helping to make the tech a little less intimidating. I

Contents

Do More with Less

Unlock unified observability and faster triaging for your team.