Jak szybko wyczyścić wszystkie kategorie dzienników zdarzeń systemu Windows

17

W systemie Windows 7 otwierasz Podgląd zdarzeń, aby przeglądać kilka kategorii. Możesz także wyczyścić jedną kategorię, klikając Wyczyść dziennik ... w prawym okienku.

Zakładając, że chcę wyczyścić WSZYSTKIE kategorie, czy mam je klikać i usuwać jeden po drugim?
Jest ich kilkadziesiąt. Czy jest szybszy sposób? Może z PowerShell?

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

nixda
źródło

Odpowiedzi:

18

Spróbuj WEvtUtil.exe

Za pomocą GUI nie można wyczyścić wszystkich dzienników jednocześnie. Przynajmniej nie to, że kiedykolwiek znalazłem. :)

Zapętlaj i usuwaj z plikiem pośrednim

Oto plik wsadowy, który używa WEVTUTIL.exe do wyświetlenia dzienników w pliku tekstowym, a następnie użyj tego pliku tekstowego do usunięcia każdego z dzienników.

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

Jeśli czujesz się niepewnie, mając to wszystko w jednym pliku wsadowym, możesz zapisać to w dwóch osobnych plikach, a następnie uruchamiać jeden po drugim:
(partia „Nuke” po prostu wyskoczy, jeśli nie znajdzie loglog.txt „w bieżącym katalogu).

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

Pętla i usuwanie bezpośrednio

Jak zauważył Logman w swojej odpowiedzi , można to jeszcze bardziej skrócić (i wyeliminować potrzebę pośredniego pliku tekstowego), używając czegoś w rodzaju (podwójna% dla pliku wsadowego):

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

Uruchom jako administrator!

Niezależnie od wybranego sposobu upewnij się, że „Uruchom jako administrator”.

Najłatwiejsze rozwiązanie, jakie znalazłem. Używam go od Visty. :)

Ƭᴇcʜιᴇ007
źródło
Zastanawiałem się nad użyciem WMI w skrypcie Python lub podobnym - bardzo dobry przykład tego, jak wsad może być łatwiejszym rozwiązaniem w niektórych scenariuszach.
Lyle Brown,
Wyjście CMD + Przegląd podglądu zdarzeń . Użyłeś drugiego przykładu w partii jako admin. Niektórych kategorii nie można wyczyścić? Dziwne. A kategoria Powershell wciąż ma 11.511 wydarzeń? Wszystkie pozostałe wydają się usunięte
nixda,
Pieprzony brakiem cytatów. przepraszam za to, naprawiłem to. :)
ᴇcʜιᴇ007
Czy możliwe jest użycie tego rozwiązania lub proponowanego przez @Logman w systemie Windows XP? Nie widzę tego wevtutilw systemie.
Sopalajo de Arrierez
1
@SopalajodeArrierez „wevtutil” jest dostępny tylko z systemu Vista i nowszych ... technet.microsoft.com/en-us/library/cc732848.aspx
Logman
19

Otwórz wiersz polecenia cmd lub utwórz skrypt wsadowy i „uruchom jako administrator”:

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

Kod programu PowerShell do czyszczenia wszystkich dzienników zdarzeń:

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

lub wybierz i wybierz w skrypcie:

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

itp...

Możesz uzyskać pełną listę wszystkich nazw kategorii zdarzeń, wpisując następujące polecenie cmd lub PowerShell:

wevtutil el

Więcej informacji można znaleźć na stronie MS TechNet . Przykłady:

Eksportuj zdarzenia z dziennika systemu do C: \ backup \ system0506.evtx:

wevtutil epl System C:\backup\system0506.evtx

Wyczyść wszystkie zdarzenia z dziennika aplikacji po zapisaniu ich w C: \ admin \ backups \ a10306.evtx:

wevtutil cl Application /bu:C:\admin\backups\a10306.evtx
Logman
źródło
Ładna skrócona wersja.
ᴇcʜιᴇ007
4
  • wevtutil działa dość wolno, szczególnie po wyczyszczeniu wszystkich dzienników (w tym pustych)

  • najszybsze rozwiązanie, jakie wymyśliłem:


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


Rezultat: „Usunięto 16 zdarzeń w 4 logach: 0,3684785 sekund”

Każda część:

  • pobiera tylko logi zawierające zdarzenia (będą zduplikowane LogNames)

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

  • wyczyść każdy

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

Pełna funkcja:

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

Jeśli zobaczysz „Get-WinEvent: Dane są nieprawidłowe”, osiągnąłeś nieudokumentowany twardy limit 256 logów. Konieczne może być najpierw przefiltrowanie dzienników. Poniższe spowoduje wybranie tylko dzienników, które mają zdarzenia (kredyt na http://www.powershellish.com/blog/2015/01/19/get-winevent-max-logs/ do diagnozy):

$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
źródło
2
Ponownie przetestowałem tę funkcję.
Przetarcie
1
@nixda: 5 minut na 169 000 zdarzeń nie jest zbyt szybkie, ale nie jestem pewien, jak wevtutil poradziłby sobie z taką samą liczbą zdarzeń (może również pominąć niektóre z nich)
Paul Bica
3

Ważne jest, aby użyć opcji delim, jeśli masz spacje w nazwach:

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

Możesz także łatwo wyłączyć rejestrowanie wszystkich zdarzeń bez zatrzymywania usługi dziennika zdarzeń:

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

Oczywiście spowoduje to wyłączenie faktycznie zainstalowanych zdarzeń oprogramowania, jeśli zainstalujesz nowe oprogramowanie, domyślnie włączone będzie rejestrowanie. Ale dobrze, że możesz zostawić uruchomiony Harmonogram zadań, więc rób to co miesiąc ;-)

Xan-Kun Clark-Davis
źródło
Jak mogę cofnąć twoje drugie polecenie (z SL i / e: false)? Lub jak mogę przywrócić wszystkie moje właściwości dziennika zdarzeń do wartości domyślnych?
PeterCo
Drogi PeterCo. Nie jestem pewien, co masz na myśli domyślnie. Sprawdź dokumentację polecenia WEVTUTIL, np. Spróbuj wprowadzić WEVTUTIL sl /?w wierszu polecenia.
Xan-Kun Clark-Davis
2

BTW, to usuwa wszystkie pliki dziennika, które mogą (w zależności od poprzednich ustawień) zwolnić sporo miejsca

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

Użyłem plików .bat, aby trochę łatwiej było wyczyścić pliki dziennika. Właśnie wybrałem prosty skrypt tutajhttp://winaero.com/blog/how-to-clear-the-windows-event-log-from-the-command-line/

Skopiowano z tego linku.

@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. Otwórz Notatnik i wklej do niego ten tekst.

  2. Zapisz go jako plik wsadowy i nadaj mu dowolną nazwę, na przykład: ClEvtLog.bat lub ClEvtLog.cmd.

  3. Uruchom go z uprawnieniami administratora.

Sakari Niittymaa
źródło