Cómo crear un archivo de log rotativo en PowerShell: paso a paso
Este tutorial muestra cómo crear un sistema simple de log rotativo en PowerShell para registrar mensajes de aplicación o scripts, útil para evitar archivos de log enormes y mantener un historial por número o por tamaño. Explica el porqué y da un ejemplo práctico de rotación por tamaño con copias de seguridad numeradas.
Requisitos previos
- Windows con PowerShell 5.1+ o PowerShell 7+
- Permiso de escritura en la carpeta donde se guardarán los logs
- Editor de texto para crear el script (p. ej.: Notepad, VS Code)
Paso 1: decidir la estrategia de rotación
Antes de codificar, elija si la rotación será por tamaño, por fecha o por número de entradas. En este ejemplo implementamos rotación por tamaño con un número fijo de copias (p. ej.: mantenemos 5 backups). La lógica es: cuando el archivo principal excede el límite, renombrar a .1, desplazar .1 a .2, etc., y crear un nuevo archivo.
Paso 2: crear funciones básicas de escritura de log
Creé una función simple que escribe entradas con timestamp. Esto separa la escritura de la lógica de rotación y facilita las pruebas.
function Write-LogEntry {
param(
[string]$Message,
[string]$LogPath = "C:\Logs\app.log"
)
$time = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
"$time - $Message" | Out-File -FilePath $LogPath -Encoding UTF8 -Append
}
Paso 3: implementar la función de rotación por tamaño
La función comprueba el tamaño del archivo y, si excede el límite, rota los archivos existentes hasta el máximo definido. Usamos manipulación de archivos con Test-Path, Get-Item y Move-Item.
function Rotate-LogIfNeeded {
param(
[string]$LogPath = "C:\Logs\app.log",
[int]$MaxBytes = 1048576, # 1 MB
[int]$MaxBackups = 5
)
if (-not (Test-Path $LogPath)) { return }
$size = (Get-Item $LogPath).Length
if ($size -lt $MaxBytes) { return }
# Eliminar el backup más antiguo si existe
$oldest = "$LogPath.$MaxBackups"
if (Test-Path $oldest) { Remove-Item -Path $oldest -Force }
# Desplazar backups (p. ej.: app.log.4 -> app.log.5)
for ($i = $MaxBackups - 1; $i -ge 1; $i--) {
$src = "$LogPath.$i"
$dst = "$LogPath." + ($i + 1)
if (Test-Path $src) { Move-Item -Path $src -Destination $dst -Force }
}
# Renombrar el archivo actual a .1
Move-Item -Path $LogPath -Destination "$LogPath.1" -Force
# Opcional: crear nuevo archivo vacío
"" | Out-File -FilePath $LogPath -Encoding UTF8
}
Paso 4: combinar rotación con escritura (ejemplo de uso)
Llame a Rotate-LogIfNeeded antes de escribir una nueva entrada. Así asegura que la entrada inicial del archivo nuevo quedará en el archivo vacío creado.
# Ejemplo de uso simple
$log = 'C:\Logs\app.log'
$maxBytes = 500000 # 500 KB
$maxBackups = 3
# Asegurar que la carpeta existe
$dir = Split-Path $log
if (-not (Test-Path $dir)) { New-Item -Path $dir -ItemType Directory | Out-Null }
# Rotar si es necesario y escribir varias entradas
Rotate-LogIfNeeded -LogPath $log -MaxBytes $maxBytes -MaxBackups $maxBackups
Write-LogEntry -Message 'Aplicación iniciada' -LogPath $log
Write-LogEntry -Message 'Evento de prueba' -LogPath $log
Paso 5: integración con scripts existentes y programación
Para integrar, importe las funciones al inicio de sus scripts y llame a Rotate-LogIfNeeded antes de Write-LogEntry. Para ejecución periódica utilice el Task Scheduler o prográmelo con su sistema de ejecución (p. ej.: ejecutar el script principal que escribe logs).
Verificar el resultado
Abra la carpeta de logs y verifique si existe app.log y archivos app.log.1, app.log.2, etc., hasta el número de backups. Confirme que app.log contiene las entradas más recientes y que los archivos numerados contienen entradas anteriores. Verifique tamaños con Get-ChildItem -Path C:\Logs | Select Name, Length.
Conclusión
Con estas funciones tiene un sistema simple de log rotativo en PowerShell que evita archivos demasiado grandes y mantiene un historial limitado. Próximos pasos: adaptar la rotación por fecha, comprimir backups (Compress-Archive) o enviar logs a un SIEM. Consejo: pruebe siempre con límites bajos para validar la rotación antes de usar en producción — ¿necesita ayuda para añadir compresión automática?