Как вы знаете, большинство «нормальных» приложений записывают свои события в журнал событий Windows (Application Event Log). Это отличное место для централизованного хранения и просмотра событий приложений, однако зачастую при возникновении необходимости журналировать события от определенного приложения в данном журнале, мы можем столкнуться с тем, что из-за большого количества и чрезмерной подробности событий, работать со стандартным журналом приложений Windows становится очень неудобно. В данном случае было бы удобно создать собственный журнал событий для данного приложения, и для него настраивать различные параметры, такие как размер журнала, фильтры и т.д., а стандартный журнал Application можно использовать как обычно, не засоряя его ненужной информацией. В ОС семейства Windows присутствует функция, позволяющая создать собственный журнал событий.
Сначала создадим новый файл журнала. Сделать это можно при помощи реестра. Запустите редактор реестра regedit и перейдите в ветку:
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog
Щелкните правой кнопкой по узлу Eventlog и создайте новый ключ (New > Key)
Имя ключа в этом случае будет являться и именем нового журнала. По умолчанию новый журнал (файл .evt) создается тут:
C:\WINDOWS\System32\Config\New Key #1.evt
Его можно переименовать, изменив строковый параметр в реестре по своему усмотрению.
Далее нужно добавить источники (Sources) событий для нового журнала. Создайте новый ключ типа Multi-String с именем “Sources”, в качестве параметров укажите имена всех приложений, который будут использовать данный журнал (каждое приложение с новой строки).
Затем нужно перенести ассоциации ваших приложений из стандартного журнала Application в ваш новый журнал. Разверните ветку “Application”, находящуюся по адресу:
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application
И скопируйте все ветки, которые относятся к интересуемым Вами приложениям в новый ветку реестра нового журналa:
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\CustomLog
Т.к. команда скопировать/вставить в редакторе реестра не работает, их можно пересоздать вручную (если их немного), или же можно осуществить перенос при помощи процедуры экспорта/импорта веток реестра с ручным редактирование .reg файла. Убедитесь, что после переноса вы удалили ключи реестра ваших приложений из ветки Application, иначе Windows не поймет, что нужно писать события в новый журнал. В том случае, если вы используете новый источник событий для журнала, нужно будет создать параметр типа DWORD с именем CustomSource и значением равным 1:
В моем примере, я создал собственное приложение .NET 2.0, причем я хочу, чтобы оно записывало события в созданный нами журнал. Для этого я создам новый ключ реестра EventMessageFile и укажу в нем путь к библиотеке журналирования.NET 2.0:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\EventLogMessages.dll
Затем нужно перезагрузить Windows, а после загрузки системы вы увидите новый журнал событий в разделе Event Viewer-а. В том случае, если ваше приложение по какой-либо причине не пишет событий в новый журнал, можно протестировать его работу вручную, откройте командую строку и перейдите в каталог:
CD C:\WINDOWS\system32
Затем наберите:
eventcreate /l CustomLog /t Information /so Application1 /id 1 /d "Test message"
В том случае, если вы все сделали правильно должно появиться окно, сообщающее о том, что событие было успешно записан в журнал, либо сообщение об ошибки и причины ее появления.
Update:
Небольшое обновление статьи по письмам читателей:
Вышеприведенная инструкция по созданию собственного журнала ориентирована на серверные ОС семейства Microsoft. Более общий способ, который должен работать в большинстве Windows следующий (отличаются пути в реестре и ключи):
Создаем новый раздел в реестре (имя раздела — имя создаваемого журнала), путь к созданному будет таким:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\NewEventLog , в котором нужно создать следующие ключи:
- «AutoBackupLogFiles» — тип DWORD, создавать или нет резервные копии журнала (0 — не создавать)
- «MaxSize» -тип DWORD, максимальны размер журнала в байтах, значение должно быть кратным 64Кб
- «Retention» — тип DWORD, время хранения записей в случае переполнения журнала.
- «File» — тип REG_EXPAND_SZ, строка, в которой содержится путь к логу журнала на жестком диске, например %SystemRoot%\System32\config\NewEventLog.evt)
- «Sources»- тип REG_MULTI_SZ, здесь указан список источников событий, чьи логи должны попадать в этот журнал, каждый источник с новой строки
Резюме: Microsoft Scripting Guy, Ed Wilson рассказывает о создании и использовании нового журнала событий посредством Windows PowerShell.
Использование PowerShell для создания нового журнала событий
Одна из замечательных вещей, которые можно делать с помощью Windows PowerShell – это создание собственного журнала событий. Здесь я говорю о классическом журнале событий (примеры таких журналов – это System, Security и Applcation). Windows PowerShell позволяет свободно читать, записывать, архивировать и очищать такие виды журналов.
Создаем журнал событий
Для создания нового журнала событий я воспользуюсь командлетом New-EventLog. Для этого мне понадобятся три вещи:
1. Открыть консоль Windows PowerShell с административными правами – в противном случае при попытке создания нового журнала будет возвращено сообщение об ошибке.
2. Имя создаваемого журнала.
3. Также мне будет нужно указать источник событий нового журнала.
Следующая команда создает новый классический журнал событий с именем ScriptingGuys и указывает источник событий с именем scripts.
New-EventLog -LogName ScriptingGuys -Source scripts
При запуске команды на экран не выводится никакой информации. Чтобы убедиться, что команда отработала должным образом, я воспользуюсь командлетом Get-EventLog с параметром –List.
C:\> Get-EventLog -List Max(K) Retain OverflowAction Entries Log ------ ------ -------------- ------- --- 20,480 0 OverwriteAsNeeded 18,504 Application 20,480 0 OverwriteAsNeeded 0 HardwareEvents 512 7 OverwriteOlder 0 Internet Explorer 20,480 0 OverwriteAsNeeded 0 Key Management Service 10,240 0 OverwriteAsNeeded 4 Lenovo-Customer Feedback 512 7 OverwriteOlder 2 Lenovo-Lenovo Patch Utility/Admin 128 0 OverwriteAsNeeded 30 OAlerts 512 7 OverwriteOlder 0 ScriptingGuys Security 20,480 0 OverwriteAsNeeded 21,437 System 15,360 0 OverwriteAsNeeded 10,059 Windows PowerShell
Конфигурируем новый журнал событий
Одна из вещей, которую я заметил при проверке создания журнала, это то, что его размер установлен в 512 KB, а срок сохранения событий равен 7 дням. Мне же нужно, чтобы размер журнала не превышал 64 KB, и события очищались по мере заполнения журнала. Мне казалось, что для этого подошел бы командлет Set-EventLog, однако командлета с таким именем не оказалось. Нужный командлет – Limit-EventLog. Просматривая файл справки, я заметил, что он обладает только одним набором параметров. Мне нужно установить параметр –OverflowAction в OverWriteAsNeeded, поэтому я предположил, что –RetentionDays нужно установить в 0. Я попробовал запустить следующую команду, но, как видите, появилось сообщение об ошибке.
C:\> Limit-EventLog -OverflowAction OverWriteAsNeeded -RetentionDays 0 -MaximumSize 64KB
Limit-EventLog : Cannot validate argument on parameter 'RetentionDays'. The 0 argument is less than the minimum allowed range of 1. Supply an argument that is greater than or equal to 1 and then try the command again. At line:1 char:65 + Limit-EventLog -OverflowAction OverWriteAsNeeded -RetentionDays 0 -MaximumSize + ~ + CategoryInfo : InvalidData: (:) [Limit-EventLog], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.LimitEventLogCommand
Тогда я попробовал запустить команду без параметра –RetentionDays, и это сработало.
Limit-EventLog -OverflowAction OverWriteAsNeeded -MaximumSize 64KB -LogName scriptingguys
Теперь я воспользуюсь командлетом Get-EventLog, чтобы убедиться, что изменения внесены. Вывод команды указывает на то, что внесение изменений произошло успешно.
C:\> Get-EventLog -list | ? log -eq scriptingguys
Max(K) Retain OverflowAction Entries Log ------ ------ -------------- ------- --- 64 0 OverwriteAsNeeded 0 ScriptingGuys
Я не могу обратиться к пустому журналу событий
Довольно интересно, что я не могу обратиться к журналу, не содержащему записей. Я пытаюсь получить содержимое журнала посредством командлета Get-EventLog и получаю следующую ошибку.
C:\> Get-EventLog -LogName scriptingguys
Get-EventLog : No matches found At line:1 char:1 + Get-EventLog -LogName scriptingguys + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (:) [Get-EventLog], ArgumentException + FullyQualifiedErrorId : GetEventLogNoEntriesFound,Microsoft.PowerShell.Commands.GetEventLogCommand
Запись в журнал событий
Для записи события, мне понадобится следующая информация:
1. Имя журнала событий (в нашем случае – это ScriptingGuys)
2. Источник события (scripts)
3. EventID (я начну с 1)
4. Тип записи (Information, Warning, Error)
5. Сообщение (то, что я хочу записать)
В следующем примере я добавляю в журнал событий новую запись.
Write-EventLog -LogName ScriptingGuys -Source scripts -Message "Dude, it works ... COOL!" -EventId 0 -EntryType information
Теперь я снова воспользуюсь командлетом Get-EventLog, чтобы получить только что записанное событие.
C:\> Get-EventLog -LogName scriptingguys
Index Time EntryType Source InstanceID Message ----- ---- --------- ------ ---------- ------- 1 Jan 29 10:27 Information scripts 0 Dude, it wor...
Автор:
Ed Wilson, Microsoft Scripting Guy
Оригинал:
http://blogs.technet.com/b/heyscriptingguy/archive/2013/02/01/use-powershell-to-create-and-to-use-a-new-event-log.aspx
Страницы в социальных сетях:
Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell
I’m creating an ASP.NET application that will log some stuff to Windows EventLog. To do this an event source has to be created first. This requires administrative priviledges so I cannot do it in the ASP.NET app.
Is there an existing command-line application that is bundled with Windows that can create an event log source, or must I roll out my own?
asked Jan 15, 2009 at 13:22
Try PowerShell 2.0’s EventLog cmdlets. For PowerShell 2.0 and upwards:
-
Run
New-EventLog
once to register the event source:New-EventLog -LogName Application -Source MyApp
-
Then use
Write-EventLog
to write to the log:Write-EventLog -LogName Application -Source MyApp -EntryType Error -Message "Immunity to iocaine powder not detected, dying now" -EventId 1
StayOnTarget
11.8k10 gold badges52 silver badges84 bronze badges
answered Aug 22, 2011 at 23:29
roufamaticroufamatic
18.2k7 gold badges57 silver badges87 bronze badges
4
You can also use Windows PowerShell with the following command:
if ([System.Diagnostics.EventLog]::SourceExists($source) -eq $false) {
[System.Diagnostics.EventLog]::CreateEventSource($source, "Application")
}
Make sure to check that the source does not exist before calling CreateEventSource, otherwise it will throw an exception.
For more info:
- http://msdn.microsoft.com/en-us/library/9t766zhb.aspx
answered Feb 19, 2010 at 22:53
Luis RochaLuis Rocha
1,38910 silver badges7 bronze badges
eventcreate2 allows you to create custom logs, where eventcreate does not.
answered Oct 5, 2009 at 21:12
Nick BoltonNick Bolton
38.5k70 gold badges175 silver badges243 bronze badges
If someone is interested, it is also possible to create an event source manually by adding some registry values.
Save the following lines as a .reg file, then import it to registry by double clicking it:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application\YOUR_EVENT_SOURCE_NAME_GOES_HERE]
"EventMessageFile"="C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\EventLogMessages.dll"
"TypesSupported"=dword:00000007
This creates an event source named YOUR_EVENT_SOURCE_NAME_GOES_HERE
.
answered Nov 26, 2015 at 12:14
M. JahedbozorganM. Jahedbozorgan
6,9142 gold badges46 silver badges51 bronze badges
Or just use the command line command:
Eventcreate
answered May 22, 2009 at 16:41
However the cmd/batch version works you can run into an issue when you want to define an eventID which is higher then 1000. For event creation with an eventID of 1000+ i’ll use powershell like this:
$evt=new-object System.Diagnostics.Eventlog(“Define Logbook”)
$evt.Source=”Define Source”
$evtNumber=Define Eventnumber
$evtDescription=”Define description”
$infoevent=[System.Diagnostics.EventLogEntryType]::Define error level
$evt.WriteEntry($evtDescription,$infoevent,$evtNumber)
Sample:
$evt=new-object System.Diagnostics.Eventlog(“System”)
$evt.Source=”Tcpip”
$evtNumber=4227
$evtDescription=”This is a Test Event”
$infoevent=[System.Diagnostics.EventLogEntryType]::Warning
$evt.WriteEntry($evtDescription,$infoevent,$evtNumber)
answered Sep 10, 2015 at 14:09
PowerShell 7
This answer worked great in 5.x for me but not in 7.x. After some sleuthing, I got the following working:
Import-Module Microsoft.PowerShell.Management -UseWindowsPowerShell
New-EventLog -LogName Application -Source MyApp
I stumbled upon the module to import via this SO answer. Apparently, there’s a set of modules you can import for Windows only cmdlet’s depending upon your needs. I’m still trying to figure out how you would determine which module to import based upon your cmdlet.
answered Oct 13, 2022 at 20:13
spottedmahnspottedmahn
15k13 gold badges109 silver badges181 bronze badges
you can create your own custom event by using diagnostics.Event log class.
Open a windows application and on a button click do the following code.
System.Diagnostics.EventLog.CreateEventSource("ApplicationName", "MyNewLog");
«MyNewLog» means the name you want to give to your log in event viewer.
for more information check this link
[ http://msdn.microsoft.com/en-in/library/49dwckkz%28v=vs.90%29.aspx]
answered May 31, 2014 at 14:58
33333333
431 silver badge9 bronze badges
0
- Download source — 30.45 KB
Fig-1 (Event viewer — Showing the new log with sample information)
Introduction
This article will give you an idea about how to create a Windows event log and write your custom message into the event log.
Background
Most of the developers are very much familiar with the Windows event log API. When developers create a Windows based application, it may be an ActiveX component, any customized DLL library, a service application, etc.; it is a very common practice to write several types of information into the event log, which is generated by that particular application runtime so we can easily keep track of all the information.
Using the Code
Before we start understanding the code, we need a little concept on System.Diagnostics
namespace. We will use the namespace to manage an event log. The namespace System.Diagnostics
provides a class name as “EventLog
” to create and write a message into the eventlog.
Let’s take an example, our goal is to write a simple C# .NET class which will create a new log name as “myEventLog
” and write a message “I will not say I have failed 1000 times; I will say that I have discovered 1000 ways that can cause failure – Thomas Edison.” as an information.
To achieve this, we need to use the following methods, properties and enum
which will be found in the System.Diagnostics
namespace.
Methods
SourceExists
: Determines whether an event source is registered on the local computer or not.CreateEventSource
: Establishes an application as able to write event information to a particular log on the system.
More details can be found at this link.WriteEntry
: Writes an entry in the event log, i.e., writes an information type entry, with the given message text, to the event log.
More details can be found at this link.
Properties
Source
: Gets or sets the source name to register and use when writing to the event log.Log
: Gets or sets the name of the log to read from or write to.
Enum
EventLogEntryType
: Specifies the event type of an event log entry.
More details can be found at this link.
Sample Code Example
public class ClsEventLog { public bool CreateLog(string strLogName) { bool Result = false; try { System.Diagnostics.EventLog.CreateEventSource(strLogName, strLogName); System.Diagnostics.EventLog SQLEventLog = new System.Diagnostics.EventLog(); SQLEventLog.Source = strLogName; SQLEventLog.Log = strLogName; SQLEventLog.Source = strLogName; SQLEventLog.WriteEntry("The " + strLogName + " was successfully initialize component.", EventLogEntryType.Information); Result = true; } catch { Result = false; } return Result; } public void WriteToEventLog(string strLogName , string strSource , string strErrDetail) { System.Diagnostics.EventLog SQLEventLog = new System.Diagnostics.EventLog(); try { if (!System.Diagnostics.EventLog.SourceExists(strLogName)) this.CreateLog(strLogName); SQLEventLog.Source = strLogName; SQLEventLog.WriteEntry(Convert.ToString(strSource) + Convert.ToString(strErrDetail), EventLogEntryType.Information); } catch (Exception ex) { SQLEventLog.Source = strLogName; SQLEventLog.WriteEntry(Convert.ToString("INFORMATION: ") + Convert.ToString(ex.Message), EventLogEntryType.Information); } finally { SQLEventLog.Dispose(); SQLEventLog = null; } } }
Conclusion
I hope that this article might be helpful to you. Enjoy!
History
- 22nd August 2009: Initial post
На чтение 4 мин. Просмотров 17 Опубликовано
Журналы событий Windows являются огромным ресурсом, поскольку они могут не только помочь вам в устранении текущих системных проблем, но также могут предоставить вам предупреждающие знаки о потенциальных будущих проблемах. Таким образом, отслеживание событий в ваших системных записях может быть ключом к тому, чтобы ваша система работала должным образом. К сожалению, просмотр журналов событий или создание пользовательских представлений может быть трудоемким ручным процессом.
К счастью, у нас есть решение, которое позволит вам легко экспортировать и фильтровать записи журнала событий Windows, а затем отправлять их по электронной почте и/или сохранять в текстовом файле. Когда этот процесс настроен как часть запланированной задачи, вы можете получать, например, предупреждения и сообщения об ошибках по электронной почте.
Содержание
- Как это устроено
- конфигурация
- Примеры
Как это устроено
Наше решение работает с помощью бесплатной утилиты MyEventViewer от Nirsoft, которая позволяет легко экспортировать журналы событий Windows в файл, разделенный запятыми. На основе этого вывода мы разработали простой в настройке пакетный скрипт, который фильтрует эти результаты, а затем может отправить по электронной почте и/или сохранить отфильтрованный файл результатов. Поскольку результаты представляют собой файл, разделенный запятыми, его можно открыть в Excel (или в вашей любимой программе CSV), а затем отсортировать и отфильтровать.
конфигурация
Параметры конфигурации и параметры задокументированы в виде встроенных комментариев в сценарии, однако мы рассмотрим некоторые из них в некоторых деталях здесь.
Имя журнала событий
При указании журналов событий, из которых вы хотите захватить события, вы должны использовать полное системное имя журнала. Это не обязательно то, что вы видите в списке журналов Event Viewer.
Например, если вы хотите захватить события из журнала «Предупреждения Microsoft Office», перейдите в диалоговое окно «Свойства» журнала.
Запишите значение в поле «Полное имя», в данном случае «OAlerts». Это будет значение, которое вам нужно будет ввести в конфигурацию скрипта.
Типы событий
Значения для типов событий – это просто текст, который вы видите в столбце «Уровень» при просмотре журналов событий. Обычно это информация, предупреждение или ошибка, но разные журналы могут иметь разные значения.
Настройка запланированных задач
Типичное использование этого сценария, скорее всего, в автоматизированном процессе. Таким образом, чтобы убедиться, что между интервалом захвата и временем запуска процесса нет совпадений, вам нужно настроить запланированное задание Windows, чтобы дополнить время захвата.
Проще говоря, если ваша конфигурация настроена на захват событий за последний день, у вас должна быть запланированная задача, которая запускается один раз в день. Если ваша конфигурация настроена на захват за последний час, запланированное задание должно запускаться один раз в час. И т.п.
В качестве дополнительного примечания, чтобы приложение MyEventViewer могло получить необходимую информацию, необходимо выполнить соответствующую запланированную задачу с правами администратора на компьютере.
Примеры
Эта конфигурация будет отправлять сообщения об ошибках и предупреждениях из журналов событий системы и приложений, записанных в последний день (24 часа), на my@email.com, а также сохранять выходные данные в папке C: \ EventNotices:
- EmailResults = 1
- EmailTo=my@email.com
- SaveResults = 1
- SaveTo = C: \ EventNotices
- TimeInterval = 3
- TimeValue = 1
- Бревна = System, Application
- Типы = Ошибка, Предупреждение
- Запланированное задание должно выполняться каждый день.
Эта конфигурация будет отправлять сообщения об ошибках по электронной почте только из журнала системных событий, записанных за последний час, на my@email.com:
- EmailResults = 1
- EmailTo=my@email.com
- SaveResults = 0
- TimeInterval = 2
- TimeValue = 1
- Бревна = System
- Типы = Ошибка
- Запланированное задание должно запускаться каждый час.
Эта конфигурация сохранит только ошибки и предупреждения из журнала событий приложений за последнюю неделю на рабочий стол пользователя JFaulkner (Windows 7) C: \ Users \ jfaulkner \ Desktop:
- EmailResults = 0
- SaveResults = 1
- SaveTo = C: \ Users \ jfaulkner \ Desktop
- TimeInterval = 3
- TimeValue = 7
- Бревна = Применение
- Типы = Ошибка, Предупреждение
- Запланированное задание должно выполняться каждую неделю.
Скачать сценарий уведомлений журнала событий с TutoryBird
Загрузите MyEventViewer от Nirsoft
Скачать Blat от Sourceforge