Cómo borrar todas las categorías de registro de eventos de Windows rápidamente

17

En Windows 7, abre el Visor de eventos para examinar varias categorías. También puede borrar una sola categoría haciendo clic en Borrar registro ... en el panel derecho.

Suponiendo que quiero borrar TODAS las categorías, ¿debo hacer clic y borrarlas una por una?
Hay docenas de ellos. ¿Hay una manera mas rápida? ¿Quizás con PowerShell?

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

nixda
fuente

Respuestas:

18

Prueba WEvtUtil.exe

No hay forma a través de la GUI para borrar todos los registros a la vez. Al menos no es lo que he encontrado. :)

Bucle y eliminar con archivo intermedio

Aquí hay un archivo por lotes que usa WEVTUTIL.exe para enumerar los registros en un archivo de texto, y luego usa ese archivo de texto para eliminar cada uno de los registros.

WEVTUTIL EL > .\LOGLIST.TXT
for /f %%a in ( .\LOGLIST.TXT ) do WEVTUTIL CL "%%a"
del .\LOGLIST.TXT
timeout 30

Si se siente inseguro al tener todo esto en un archivo por lotes, puede guardarlo en dos archivos separados y luego ejecutar uno después del otro:
(El lote "Nuke" simplemente generará un error si no encuentra un "loglist.txt "en su directorio actual.)

Populate-LogList.cmd

@ECHO OFF
REM Source: /superuser//a/655185/389368
WEvtUtil.exe enum-logs > .\LOGLIST.TXT

Nuke-LogList.cmd

@ECHO OFF
REM Source: /superuser//a/655185/389368
for /f %%a in ( .\LOGLIST.TXT ) do WEvtUtil.exe clear-log "%%a"
del .\LOGLIST.TXT
timeout 30

Bucle y eliminar directamente

Como Logman señaló en su respuesta , esto se puede acortar aún más (y eliminar la necesidad del archivo de texto intermedio) mediante el uso de algo como (el doble de% para el archivo por lotes):

for /f %%a in ('WEVTUTIL EL') do WEVTUTIL CL "%%a"
timeout 30

Ejecutar como administrador!

De cualquier forma que elija, asegúrese de "Ejecutar como administrador".

La solución más fácil que he encontrado. Lo he estado usando desde Vista. :)

Ƭᴇcʜιᴇ007
fuente
Estaba considerando usar WMI en un script de Python o similar, un muy buen ejemplo de cómo el lote puede ser una solución más fácil en ciertos escenarios.
Lyle Brown el
Salida CMD + Visión general del visor de eventos . Usó su segundo ejemplo por lote como administrador. Algunas categorías no se pueden borrar? Extraño. ¿Y la categoría Powershell todavía tiene 11.511 eventos? Todos los demás parecen estar despejados
nixda
Atornillado por la falta de citas. perdón por eso, lo arreglé. :)
Ƭᴇcʜιᴇ007
¿Es posible utilizar esta solución o la propuesta por @Logman en Windows XP? No veo que tenga wevtutilen el sistema.
Sopalajo de Arrierez
1
@SopalajodeArrierez "wevtutil" solo está disponible desde Vista y superior ... technet.microsoft.com/en-us/library/cc732848.aspx
Logman
19

Abra el indicador de cmd o cree un script por lotes y "ejecute como administrador":

for /f %x in ('wevtutil el') do wevtutil cl "%x"

Código de Powershell para borrar todos los registros de eventos:

wevtutil el | Foreach-Object {Write-Host "Clearing $_"; wevtutil cl "$_"}

o escoger y elegir en un script:

wevtutil.exe cl Analytic
wevtutil.exe cl Application
wevtutil.exe cl DirectShowFilterGraph
wevtutil.exe cl DirectShowPluginControl
wevtutil.exe cl EndpointMapper
wevtutil.exe cl ForwardedEvents
wevtutil.exe cl HardwareEvents
wevtutil.exe cl Internet Explorer
wevtutil.exe cl Key Management Service
wevtutil.exe cl MF_MediaFoundationDeviceProxy
wevtutil.exe cl "Media Center"
wevtutil.exe cl MediaFoundationDeviceProxy
wevtutil.exe cl MediaFoundationPerformance
wevtutil.exe cl MediaFoundationPipeline
wevtutil.exe cl MediaFoundationPlatform
wevtutil.exe cl Microsoft-IE/Diagnostic
wevtutil.exe cl Microsoft-IEFRAME/Diagnostic
wevtutil.exe cl Microsoft-PerfTrack-IEFRAME/Diagnostic
wevtutil.exe cl Microsoft-PerfTrack-MSHTML/Diagnostic

etc ...

Puede obtener una lista completa de todos los nombres de categorías de eventos escribiendo lo siguiente en un indicador de cmd o powershell:

wevtutil el

Se puede encontrar más información en MS TechNet . Ejemplos:

Exporte eventos desde el registro del sistema a C: \ backup \ system0506.evtx:

wevtutil epl System C:\backup\system0506.evtx

Borre todos los eventos del registro de la aplicación después de guardarlos en C: \ admin \ backups \ a10306.evtx:

wevtutil cl Application /bu:C:\admin\backups\a10306.evtx
Logman
fuente
Bonita versión acortada.
Ƭᴇcʜιᴇ007
4
  • wevtutil es bastante lento, especialmente cuando borra todos los registros (incluidos los vacíos)

  • La solución más rápida que se me ocurrió:


ForEach ( $l in ( Get-WinEvent * ).LogName | sort | get-unique ) {[System.Diagnostics.Eventing.Reader.EventLogSession]::GlobalSession.ClearLog("$l")}


Resultado: "Se borraron 16 eventos en 4 registros: 0.3684785 segundos"

Cada parte:

  • solo obtiene registros que contienen eventos (habrá LogNames duplicados)

    ForEach ($ l en (Get-WinEvent *) .LogName | sort | get-unique)

  • limpiar cada uno

    System.Diagnostics.Eventing.Reader.EventLogSession] :: GlobalSession.ClearLog ("$ l")

Función completa:

function Clear-EventLogs
{
    Begin
    {
        $t1          = ( Measure-Command -Expression{ $active = ( Get-WinEvent ).LogName } ).TotalSeconds
        $totalEvents = $active.Count
        $active      = $active | Sort | Get-Unique
        $totalLogs   = $active.Count
    }
    Process
    {
        $t2 = ( Measure-Command -Expression{
            ForEach ( $l in $active )
            {
                [System.Diagnostics.Eventing.Reader.EventLogSession]::GlobalSession.ClearLog( "$l" )
                # ForEach-Object { Wevtutil.exe cl "$l" }
            }
        } ).TotalSeconds
    }
    End     { $t3 = $t1 + $t2; Write-Output "Cleared $totalEvents events in $totalLogs logs: $t3 seconds" }
}

Si ve "Get-WinEvent: los datos no son válidos", ha alcanzado el límite rígido indocumentado de 256 registros. Puede ser necesario filtrar los registros primero. Lo siguiente seleccionará solo los registros que tienen eventos (crédito a http://www.powershellish.com/blog/2015/01/19/get-winevent-max-logs/ para el diagnóstico):

$logs = Get-WinEvent -ListLog * | Where-Object {$_.RecordCount} | Select-Object -ExpandProperty LogName
ForEach ( $l in ( Get-WinEvent $logs ).LogName | sort | get-unique ) {[System.Diagnostics.Eventing.Reader.EventLogSession]::GlobalSession.ClearLog("$l")}
paul bica
fuente
2
Volví a probar esta función. Le tomó 271 segundos borrar 168802 eventos
nixda
1
@nixda: 5 minutos de 169.000 eventos no es muy rápido, pero no estoy seguro de cómo sería wevtutil lleva a cabo con el mismo número de eventos (que también puede pasar por alto algunos de ellos)
Paul bica
3

Es importante usar la opción delim si tiene espacios en los nombres:

WEVTUTIL EL > .\LOGLIST.TXT
for /f "delims=" %%a in ( .\LOGLIST.TXT ) do WEVTUTIL CL "%%a"

También puede deshabilitar fácilmente todo el registro de eventos sin detener el servicio de registro de eventos:

for /f "delims=" %%a in ('WEVTUTIL EL') do WEVTUTIL SL "%%a" /e:false

Por supuesto, esto solo deshabilitará los eventos de software realmente instalados, si instala un nuevo software, tendrá el registro habilitado de forma predeterminada. Pero es bueno que pueda dejar el Programador de tareas en ejecución, así que hágalo todos los meses ;-)

Xan-Kun Clark-Davis
fuente
¿Cómo puedo revertir su segundo comando (con SL y / e: falso)? ¿O cómo puedo restaurar todas mis propiedades de registro de eventos a las predeterminadas?
PeterCo
Estimado PeterCo. No estoy seguro de lo que quieres decir por defecto. Consulte la documentación del comando WEVTUTIL, por ejemplo, intente ingresar WEVTUTIL sl /?en una línea de comando.
Xan-Kun Clark-Davis
2

Por cierto, esto borra todos los archivos de registro, que pueden (según la configuración anterior) liberar bastante espacio

WEVTUTIL EL > .\LOGLIST.TXT
for /f "delims=" %%a in ( .\LOGLIST.TXT ) do WEVTUTIL CL "%%a"
del .\LOGLIST.TXT
timeout 10
Xan-Kun Clark-Davis
fuente
1

He usado archivos .bat para que sea un poco más fácil borrar los archivos de registro. Acabo de elegir el guión simple aquíhttp://winaero.com/blog/how-to-clear-the-windows-event-log-from-the-command-line/

Copiado de ese enlace.

@echo off
FOR /F "tokens=1,2*" %%V IN ('bcdedit') DO SET adminTest=%%V
IF (%adminTest%)==(Access) goto noAdmin
for /F "tokens=*" %%G in ('wevtutil.exe el') DO (call :do_clear "%%G")
echo.
echo Event Logs have been cleared!
goto theEnd
:do_clear
echo clearing %1
wevtutil.exe cl %1
goto :eof
:noAdmin
echo You must run this script as an Administrator!
echo.
:theEnd
  1. Abra el Bloc de notas y copie y pegue el texto en él.

  2. Guárdelo como un archivo por lotes y asígnele el nombre que desee, por ejemplo: ClEvtLog.bat o ClEvtLog.cmd.

  3. Ejecútelo con derechos de administrador.

Sakari Niittymaa
fuente