В Linux, если я хочу наблюдать за системным журналом в терминале в режиме реального времени, я могу использовать команду tail
для вывода /var/log/syslog
файла с ключом -f
или --follow
, которая «выводит(ют) добавленные данные по мере роста файла», например:
tail -f /var/log/syslog
... или также можно использовать:
dmesg --follow
... где -w, --follow
аргумент означает dmesg
«Ждать новых сообщений».
В любом случае, оба эти приложения в этом режиме обычно блокируют терминал, а затем выводят новые текстовые строки/сообщения по мере их поступления, пока вы не нажмете Ctrl-C, чтобы выйти из них.
В Windows, я понимаю, что эквивалентом системного журнала является Event (Log) Viewer, который является приложением с графическим интерфейсом. Через некоторое время я обнаружил,https://www.petri.com/command-line-event-logWEVTUTIL.EXE
- где отмечается, что для запроса журнала событий Windows можно использовать приложение командной строки.
Итак, я попробовал это:
C:\>wevtutil qe System
... но это просто сбрасывает все события, а затем завершает работу (так же, как если бы вы вызвали функцию dmesg
в Linux без каких-либо аргументов).
Я просмотрел справку wevtutil /?
, но не вижу ни одного аргумента командной строки, который бы включал wevtutil
режим «следования» (т. е. блокировал бы терминал после того, как выгрузил все данные до этой точки, а затем выводил бы новые события/текстовые строки по мере их регистрации).
Итак - возможно ли заставить wevtutil
работать в режиме follow, и если да, то как? Если нет, есть ли другая утилита, которую я мог бы использовать, которая делала бы то же самое - выгружала бы системный журнал событий Windows на терминал в режиме follow?
решение1
Идти кsysinternals.com, затем посмотрите документацию по ProcessExplorer. Вы можете установить фильтры для exe, событий, сообщений и в реальном времени или по продолжительности. Вы также можете отслеживать и отлаживать. Sysinternals Suite дает гораздо более подробную информацию, чем Event Viewer.
Найдя нужные события или объекты, проверьте свойства, чтобы узнать, что можно вызвать в терминале.
решение2
Хорошо, поискал еще кое-что и нашел вот это:
... где приведены примеры использования PowerShell для этого поведения. Основываясь на этом посте, вот что я сделал:
Сначала я хотел создать скрипт PowerShell; страницаhttps://www.windowscentral.com/how-create-and-run-your-first-powershell-script-file-windows-10отмечает, что расширением для скрипта PowerShell является .ps1
.
Затем я хотел специально создать скрипт в корне диска C:
. Оказывается, это защищено в Windows 10 — для этого у вас должны быть права администратора (иначе вы получите Access is denied.
). Поэтому я запустил командную строку в режиме администратора («Запуск от имени администратора») и создал эти два файла:
C:\WINDOWS\system32>cd C:\
C:\>echo > wevent_tail_01.ps1
C:\>echo > wevent_tail_02.ps1
Обратите внимание, что эти файлы не будут пустыми, но будут содержать текстовую строку ECHO is on.
, однако эту строку можно удалить; или (https://ss64.com/ps/syntax-comments.html) с префиксом #
, который является символом комментария в PowerShell.
Затем я открыл эти файлы в Блокноте, чтобы отредактировать их — из того же терминала, чтобы сохранить административные привилегии (в противном случае при попытке сохранить файлы из Блокнота будет отказано в доступе):
C:\>notepad wevent_tail_01.ps1
C:\>notepad wevent_tail_02.ps1
Затем я вставил этот код из SO:15262196 как wevent_tail_01.ps1
:
$idx = (get-eventlog -LogName System -Newest 1).Index
while ($true)
{
start-sleep -Seconds 1
$idx2 = (Get-EventLog -LogName System -newest 1).index
get-eventlog -logname system -newest ($idx2 - $idx) | sort index
$idx = $idx2
}
... и я вставил код издругой ответв wevent_tail_02.ps1
, но я не смог заставить его работать. Поэтому в оставшейся части этого поста я буду использовать только wevent_tail_01.ps1
.
Теперь пришло время запустить этот скрипт в PowerShell; в сообщении windowscentral указано, что скрипты запускаются путем добавления к их пути префикса амперсанда и пробела &
; однако, если вы просто запустите PowerShell как обычно и попробуете, вы получите:
PS C:\> & "C:\wevent_tail_01.ps1"
& : File C:\wevent_tail_01.ps1 cannot be loaded because running scripts is disabled on this system. For more
information, see about_Execution_Policies at https:/go.microsoft.com/fwlink/?LinkID=135170.
At line:1 char:3
+ & "C:\wevent_tail_01.ps1"
+ ~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : SecurityError: (:) [], PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
В сообщении windowscentral рекомендуется использовать Set-ExecutionPolicy RemoteSigned
для исправления этой проблемы, но для выполнения этой команды вам снова потребуется запустить PowerShell с правами администратора; однако вы также можете ограничить его доступом для текущего пользователя, в этом случае вы можете сохранить обычно запускаемый PowerShell:
PS C:\> Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
Execution Policy Change
The execution policy helps protect you from scripts that you do not trust. Changing the execution policy might expose
you to the security risks described in the about_Execution_Policies help topic at
https:/go.microsoft.com/fwlink/?LinkID=135170. Do you want to change the execution policy?
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "N"): A
PS C:\>
Итак, на этом этапе у нас должно быть разрешение на запуск нашего скрипта:
PS C:\> & "C:\wevent_tail_01.ps1"
... и, конечно, скрипт заблокирует терминал, но, скорее всего, никакого текста не будет. Поэтому мы хотели бы протестировать и посмотреть, работает ли это.
Для этого нам понадобится открыть еще один PowerShell, но с административными свойствами; нужную информацию я нашел наhttps://mcpmag.com/articles/2016/09/08/powershell-to-write-to-the-event-log.aspx- вкратце: чтобы записать произвольные данные в журналы событий Windows, нам нужно указать «источник»:
PS C:\WINDOWS\system32> New-EventLog -LogName System -Source 'MySysTest'
... и затем мы можем использовать Write-EventLog
для записи в журнал событий:
PS C:\WINDOWS\system32> Write-EventLog -LogName "System" -Source "MySysTest" -EventID 3001 -EntryType Information -Message "MyApp added a user-requested feature to the display." -Category 1 -RawData 10,20
PS C:\WINDOWS\system32> Write-EventLog -LogName "System" -Source "MySysTest" -EventID 3001 -EntryType Warning -Message "MyApp added a user-requested feature to the display." -Category 1 -RawData 10,20
PS C:\WINDOWS\system32> Write-EventLog -LogName "System" -Source "MySysTest" -EventID 3001 -EntryType Error -Message "MyApp added a user-requested feature to the display." -Category 1 -RawData 10,20
Если теперь переключиться на первый PowerShell, где C:\wevent_tail_01.ps1
был запущен и заблокирован, мы должны увидеть что-то вроде:
PS C:\> & "C:\wevent_tail_01.ps1"
Index Time EntryType Source InstanceID Message
----- ---- --------- ------ ---------- -------
2577 Jun 27 10:34 Information MySysTest 3001 MyApp added a user-requested feature to the dis...
2578 Jun 27 10:35 Warning MySysTest 3001 MyApp added a user-requested feature to the dis...
2579 Jun 27 10:35 Error MySysTest 3001 MyApp added a user-requested feature to the dis...
На самом деле, сначала я этого не увидел, когда переключился на этот терминал, но потом, кажется, я щелкнул по нему правой кнопкой мыши, и он «проснулся», а затем начал выводить строки в реальном времени.
Ну, думаю, это то, чего я хотел, хотя я и надеялся, что это было бы немного проще...
EDIT: если вы хотите отслеживать как системный, так и прикладной журнал, вот скрипт PowerShell:
$sidx = (get-eventlog -LogName System -Newest 1).Index
$aidx = (get-eventlog -LogName Application -Newest 1).Index
while ($true)
{
start-sleep -Seconds 1
$sidx2 = (Get-EventLog -LogName System -newest 1).index
$aidx2 = (Get-EventLog -LogName Application -newest 1).index
get-eventlog -logname system -newest ($sidx2 - $sidx) | sort index
get-eventlog -logname application -newest ($aidx2 - $aidx) | sort index
$sidx = $sidx2
$aidx = $aidx2
}
... и чтобы проверить, выиметьчтобы создать нового поставщика с уникальным именем, зарегистрированным в журнале приложений, например:
New-EventLog -LogName Application -Source 'MyAppTest'
... которые вы можете протестировать/запустить с помощью:
Write-EventLog -LogName "Application" -Source "MyAppTest" -EventID 3001 -EntryType Error -Message "MyApp added a user-requested feature to the display." -Category 1 -RawData 10,20