17

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

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

6 ответов6

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
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» в своем текущем каталоге.)

Заполняем-LogList.cmd

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

Nuke-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

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

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

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

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

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

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

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 | сортировать | получить уникальный)

  • очистить каждый

    Система.Диагностика.Троеборью.Читатель.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")}
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

Конечно, это отключит только фактически установленные программные события, если вы устанавливаете новое программное обеспечение, по умолчанию будет включено ведение журнала. Но хорошо, что вы можете оставить планировщик заданий включенным, так что делайте это каждый месяц ;-)

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. Запустите его с правами администратора.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .