Как быстро очистить все категории журнала событий Windows

17

Под Windows 7 вы открываете Event Viewer для просмотра нескольких категорий. Вы также можете очистить одну категорию, нажав Очистить журнал ... на правой панели.

Предполагая, что я хочу очистить ВСЕ категории, я должен щелкнуть и очистить их одну за другой?
Их десятки. Есть ли более быстрый способ? Может быть, с PowerShell?

введите описание изображения здесь введите описание изображения здесь

nixda
источник

Ответы:

18

Попробуйте WEvtUtil.exe

Через графический интерфейс невозможно очистить все журналы одновременно. По крайней мере, не то, что я когда-либо нашел. :)

Цикл и удаление с промежуточным файлом

Вот пакетный файл, который использует 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

Зацикливание и удаление напрямую

Как указал Логман в своем ответе , это можно еще больше сократить (и устранить необходимость в промежуточном текстовом файле), используя что-то вроде (%'s double для пакетного файла):

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

Запуск от имени администратора!

Какой бы путь вы ни выбрали, убедитесь, что вы «Запуск от имени администратора».

Самое простое решение, которое я нашел. Использую его с Vista. :)

Ƭᴇcʜιᴇ007
источник
Я рассматривал возможность использования WMI в скрипте Python или аналогичном - очень хороший пример того, как пакетная обработка может быть более простым решением в определенных сценариях.
Лайл Браун
CMD выход + обзор просмотра событий . Использовал ваш второй пример с помощью пакета в качестве администратора. Некоторые категории не могут быть очищены? Странный. И у категории Powershell все еще есть события 11.511? Все остальные, кажется, очищены
никсда
Пьяный от отсутствия цитат. извини за это, исправил. :)
Ƭᴇcʜιᴇ007
Возможно ли использовать это решение или предложенное @Logman в Windows XP? Я не вижу этого wevtutilв системе.
Сопалахо де Арриерес
1
@SopalajodeArrierez «wevtutil» доступен только в Vista и более поздних
версиях
19

Откройте командную строку или создайте пакетный скрипт и «запустите от имени администратора»:

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

и т.д...

Вы можете получить полный список всех имен категорий событий, набрав в командной строке или 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")}


Результат: «Очистил 16 событий в 4 логах: 0.3684785 секунд»

Каждая часть:

  • получает только журналы, содержащие события (будут дубликаты LogNames)

    ForEach ($ l 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
Я перепроверил эту функцию. Чтобы стереть 168802 события, потребовалось 271 секунда
nixda
1
@ nixda: 5 минут для 169 000 событий не очень быстрые, но я не уверен, как wevtutil будет работать с таким же количеством событий (может также пропустить некоторые из них)
Пол Бика,
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 /?в командной строке.
Ксан-Кун, Кларк-Дэвис,
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. Запустите его с правами администратора.

Сакари Нииттымаа
источник