El Visor de eventos de Windows es una herramienta poderosa para rastrear el comportamiento del sistema y las aplicaciones instaladas. Sin embargo, en entornos donde se requiere análisis avanzado, auditoría o correlación de eventos, es útil automatizar la extracción y el formateo de estos logs usando PowerShell.
Este artículo describe cómo exportar los eventos de cualquier registro del sistema operativo (por ejemplo, de aplicaciones de seguridad, bases de datos, navegadores o servicios internos) desde PowerShell, filtrando por fechas y guardando los resultados en un archivo legible.
Objetivo
Exportar todos los eventos generados en cualquier log de eventos específico dentro de un período de tiempo (por ejemplo, los últimos 30 días) y almacenarlos en un archivo .txt
en una ruta local (C:\loganalisis
).
Paso 1 – Identificar los logs disponibles
Para conocer todos los registros de eventos disponibles en el sistema:
Get-WinEvent -ListLog * | Sort-Object LogName
Esto devuelve registros como:
Application
System
Security
Microsoft-Windows-Windows Defender/Operational
...
Paso 2 – Consultar eventos manualmente (opcional)
Para visualizar los últimos eventos de un log cualquiera (por ejemplo, Application
):
Get-WinEvent -LogName "Application" -MaxEvents 10 |
Format-List TimeCreated, Id, LevelDisplayName, Message
Paso 3 – Exportar eventos a archivo .txt
El siguiente script permite:
- Seleccionar cualquier log de eventos (
Application
,System
,Security
, o personalizado). - Exportar los eventos de los últimos 30 días.
- Guardarlos en un archivo legible en
C:\loganalisis
.
Script genérico completo
# Parámetro: nombre del log que deseas consultar (puedes cambiarlo a otro)
$logName = "Application" # Cambia esto según lo que necesites: "System", "Security", "Microsoft-Windows-Defender/Operational", etc.
# Crear carpeta si no existe
$logFolder = "C:\loganalisis"
if (-not (Test-Path $logFolder)) {
New-Item -Path $logFolder -ItemType Directory | Out-Null
}
# Definir fecha de inicio (últimos 30 días)
$startDate = (Get-Date).AddDays(-30)
# Definir ruta del archivo de salida
$timestamp = Get-Date -Format "yyyyMMdd-HHmmss"
$logFileName = $logName -replace '[\\\/\:\*\?"<>\|]', '_' # Reemplaza caracteres no válidos
$outputFile = "$logFolder\logs_${logFileName}_30dias_$timestamp.txt"
# Obtener eventos del log desde hace 30 días
$events = Get-WinEvent -LogName $logName |
Where-Object { $_.TimeCreated -ge $startDate }
# Formatear eventos de forma legible
$formatted = $events | ForEach-Object {
"=== EVENTO ===`n" +
"Fecha: $($_.TimeCreated)`n" +
"ID: $($_.Id)`n" +
"Nivel: $($_.LevelDisplayName)`n" +
"Origen: $($_.ProviderName)`n" +
"Mensaje:`n$($_.Message)`n"
}
# Guardar en archivo
$formatted | Out-File -FilePath $outputFile -Encoding UTF8
# Confirmación
Write-Output "Logs del registro '$logName' exportados a: $outputFile"
Personalizaciones útiles
- Cambiar el rango de fechas:
- 7 días:
(Get-Date).AddDays(-7)
- 2 semanas:
(Get-Date).AddDays(-14)
- 7 días:
- Filtrar solo por errores:
Where-Object { $_.TimeCreated -ge $startDate -and $_.LevelDisplayName -eq "Error" }
- Buscar por palabras clave:
Where-Object { $_.Message -like "*fail*" -or $_.Message -like "*error*" }
- Exportar a CSV para Excel:
Reemplazar el bloque de formato por algo como:$events | Select-Object TimeCreated, Id, LevelDisplayName, ProviderName, Message | Export-Csv -Path "$logFolder\logs_$logFileName.csv" -NoTypeInformation -Encoding UTF8
Resultado esperado
Se genera un archivo .txt
en C:\loganalisis\
con nombre como:
logs_Application_30dias_20250702-190300.txt
Cada entrada tiene el siguiente formato:
=== EVENTO ===
Fecha: 01/07/2025 18:23:14
ID: 1000
Nivel: Error
Origen: Application Error
Mensaje:
Faulting application name: myapp.exe, version: 1.0.0.1, faulting module: ntdll.dll...