모든 Windows 이벤트 로그 범주를 빠르게 지우는 방법


17

Windows 7에서 이벤트 뷰어를 열어 여러 범주를 찾아보십시오. 오른쪽 창에서 Clear Log ... 를 클릭하여 단일 범주를 지울 수도 있습니다.

모든 범주를 지우고 싶다고 가정하면 범주를 하나씩 클릭하여 지워야합니까?
수십 개가 있습니다. 더 빠른 방법이 있습니까? 아마 PowerShell?

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오

답변:


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

하나의 배치 파일에이 모든 것이 안전하지 않다고 느끼면이 파일을 두 개의 개별 파일로 저장 한 다음 하나씩 실행할 수 있습니다
. ""Nuke "배치는"loglist.txt를 찾지 못하면 오류가 발생합니다 "현재 디렉토리에 있습니다.)

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

루프 및 직접 삭제

Logman 이 그의 답변 에서 지적했듯이 (배치 파일의 % s double)과 같은 것을 사용하여 이것을 단축 할 수 있습니다 (중간 텍스트 파일이 필요 없음).

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

관리자로 실행하십시오!

어떤 방법을 선택하든 "관리자 권한으로 실행"을 확인하십시오.

내가 찾은 가장 쉬운 솔루션. Vista 이후로 사용되었습니다. :)


파이썬 스크립트 또는 이와 유사한 방식으로 WMI를 사용하는 것을 고려하고 있었는데 특정 시나리오에서 배치가 더 쉬운 솔루션이 될 수있는 좋은 예입니다.
Lyle Brown

CMD 출력 + 이벤트 뷰어 개요 . 배치를 통해 두 번째 예를 관리자로 사용했습니다. 일부 카테고리를 지울 수 없습니까? 이상한. 그리고 Powershell 카테고리에는 여전히 11.511 이벤트가 있습니까? 다른 모든 것들이 해결 된 것 같습니다
nixda

따옴표가 부족하여 망했습니다. 그것에 대해 미안, 고쳤다. :)
Ƭᴇcʜιᴇ007

이 솔루션을 사용하거나 Windows XP에서 @Logman이 제안한 것이 가능합니까? wevtutil시스템에 없는 것으로 보입니다 .
Sopalajo de Arrierez

1
@SopalajodeArrierez "wevtutil"은 Vista 이상에서만 사용할 수 있습니다 ... technet.microsoft.com/en-us/library/cc732848.aspx
Logman

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ʜιᴇ007

4
  • wevtutil은 특히 모든 로그를 지우면 (빈 로그 포함) 매우 느립니다.

  • 내가 생각해 낸 가장 빠른 솔루션 :


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


Resul : "4 개의 로그에 16 개의 이벤트가 발생했습니다 : 0.3684785 초"

각 부분:

  • 이벤트가 포함 된 로그 만 가져옵니다 (중복 된 LogName이 있음)

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

  • 각각 클리어

    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
이 기능을 다시 테스트했습니다. 그것은 168,802 이벤트를 닦아 271초했다
nixda

1
@nixda : 169,000 개의 이벤트에 대해 5 분은 그리 빠르지는 않지만 wevtutil이 같은 수의 이벤트로 어떻게 수행하는지 잘 모르겠습니다 (일부 생략 가능)
paul bica

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

PeterCo에게 나는 당신이 기본적으로 무엇을 의미하는지 잘 모르겠습니다. WEVTUTIL 명령에 대한 문서를 확인하십시오 (예 : WEVTUTIL sl /?명령 행 에 입력하십시오) .
Xan-Kun Clark-Davis

2

BTW, 이것은 모든 로그 파일을 지우며 (이전 설정에 따라) 상당한 공간을 확보 할 수 있습니다

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. 관리자 권한으로 실행하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.