如何快速清除所有Windows事件日志类别


17

在Windows 7下,打开“事件查看器”以浏览多个类别。您还可以通过单击右窗格中的“ 清除日志...”清除单个类别。

假设我要清除所有类别,我是否应该逐个点击并清除它们?
有几十个。有更快的方法吗?也许使用PowerShell?

在此输入图像描述 在此输入图像描述

Answers:


18

试试WEvtUtil.exe

GUI无法一次清除所有日志。至少不是我找到过的。:)

使用中间文件循环和删除

这是一个批处理文件,它使用WEVTUTIL.exe将日志列出到文本文件中,然后使用该文本文件删除每个日志。

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

如果您觉得将这一切都放在一个批处理文件中是不安全的,那么您可以将其保存到两个单独的文件中,然后一个接一个地运行:(
如果没有找到“loglist.txt”,“Nuke”批处理将会出错“在其当前目录中。)

填充,LogList.cmd

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

核弹,LogList.cmd

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

直接循环和删除

正如Logman在他的回答中所指出的那样,可以通过使用类似(批处理文件的%)的内容来进一步缩短(并消除对中间文本文件的需要):

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

以管理员身份运行

无论您选择哪种方式,请确保“以管理员身份运行”。

我找到的最简单的解决方案。从Vista开始使用它。:)


我正在考虑在python脚本或类似程序中使用WMI - 在某些情况下批处理如何成为更简单的解决方案的非常好的示例。
莱尔布朗2013年

CMD输出 + 事件查看器概述。使用批处理的第二个示例作为管理员。有些类别无法清除?奇怪。而Powershell类别仍然有11.511个事件?所有其他人似乎都被清除了
nixda 2013年

被缺乏报价搞砸了。抱歉,修好了。:)
Ƭᴇcʜιᴇ0072013年

是否可以在Windows XP中使用此解决方案或@Logman提出的解决方案?我没有wevtutil在系统中看到它。
Sopalajo de Arrierez 2014年

1
@SopalajodeArrierez“wevtutil”仅适用于Vista及以上版本... technet.microsoft.com/en-us/library/cc732848.aspx
Logman 2014年

19

打开cmd提示符或创建批处理脚本并“以管理员身份运行”:

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

用于清除所有事件日志的Powershell代码:

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

或者在脚本中挑选:

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

等等...

您可以通过在cmd提示符或powershell中键入以下内容来获取所有事件类别名称的完整列表:

wevtutil el

有关详细信息,请访问MS TechNet。例子:

将事件从系统日志导出到C:\ backup \ system0506.evtx:

wevtutil epl System C:\backup\system0506.evtx

将应用程序日志中的所有事件保存到C:\ admin \ backups \ a10306.evtx后清除所有事件:

wevtutil cl Application /bu:C:\admin\backups\a10306.evtx

很好的缩短版本。
Ƭᴇcʜιᴇ0072013年

4
  • wevtutil非常慢,特别是在清除所有日志(包括空日志)时

  • 我提出的最快解决方案:


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


结果:“清除了4个日志中的16个事件:0.3684785秒”

每个部分:

  • 只获取包含事件的日志(会有重复的LogNames)

    ForEach($ get in(Get-WinEvent *)。LogName | sort | get-unique)

  • 清除每一个

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

功能齐全:

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" }
}

如果您看到“Get-WinEvent:数据无效”,则您已达到256个日志的未记录的硬限制。可能需要先过滤日志。以下将仅选择具有事件的日志(信用到http://www.powershellish.com/blog/2015/01/19/get-winevent-max-logs/进行诊断):

$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")}

2
我重新测试了这个功能。这场比赛耗时271秒,击败168802赛事
尼克斯

1
@nixda:169,000个事件的5分钟不是很快,但是我不确定wevtutil如何用相同数量的事件执行(它也可能会跳过其中一些)
保罗比卡2015年

3

如果名称中包含空格,则使用delim选项很重要:

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

您还可以在不停止事件日志服务的情况下轻松禁用所有事件记录:

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

当然这只会禁用实际安装的软件事件,如果安装新软件,它将默认启用日志记录。但是好的,你可以让任务计划程序运行,所以每个月都要这样做;-)


如何恢复第二个命令(使用SL和/ e:false)?或者如何将所有事件日志属性恢复为默认值?
PeterCo

亲爱的彼得。我不确定,默认是什么意思。检查WEVTUTIL命令的文档,例如尝试WEVTUTIL sl /?在命令行输入 。
Xan-Kun Clark-Davis

2

顺便说一句,这会清除所有日志文件,这可以(取决于以前的设置)释放相当大的空间

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

1

我使用.bat文件使清除日志文件更容易一些。刚刚在这里选择了简单的脚本http://winaero.com/blog/how-to-clear-the-windows-event-log-from-the-command-line/

从该链接复制。

@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. 打开记事本并将该文本复制粘贴到其中。

  2. 将其另存为批处理文件,并为其指定任何名称,例如:ClEvtLog.bat或ClEvtLog.cmd。

  3. 使用管理员权限运行它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.