이벤트를 기반으로 NT 이벤트 로그에 로깅
NTEventLogEventConsumer 클래스는 지정된 이벤트가 발생할 때 Windows 이벤트 로그에 메시지를 씁니다. 이 클래스는 WMI에서 제공하는 표준 이벤트 소비자입니다.
참고
인증된 사용자는 기본적으로 원격 컴퓨터의 응용 프로그램 로그에 이벤트를 기록할 수 없습니다. 따라서 NTEventLogEventConsumer 클래스의 UNCServerName 속성을 사용하고 원격 컴퓨터를 해당 값으로 지정하면 이 항목에 설명된 예제가 실패합니다. 이벤트 로그 보안을 변경하는 방법을 알아보려면 이 KB 문서를 참조하세요.
표준 소비자를 사용하기 위한 기본 절차는 표준 소비자를 사용하여 이벤트 모니터링 및 응답에 설명되어 있습니다. 다음은 NTEventLogEventConsumer 클래스를 사용할 때 필요한 기본 절차 이외의 추가 단계입니다. 이 단계에서는 응용 프로그램 이벤트 로그에 쓰는 이벤트 소비자를 만드는 방법을 설명합니다.
다음 절차에서는 NT 이벤트 로그에 쓰는 이벤트 소비자를 만드는 방법을 설명합니다.
Windows 이벤트 로그에 쓰는 이벤트 소비자 만들기
MOF(Managed Object Format) 파일에서 NTEventLogEventConsumer의 인스턴스를 만들어 쿼리에서 요청하는 이벤트를 수신합니다. MOF 코드 작성에 대한 자세한 내용은 MOF(Managed Object Format) 클래스 디자인을 참조하세요.
__EventFilter 인스턴스를 만들고 이름을 지정한 다음 NT 이벤트 로그에 쓰기를 트리거하는 이벤트 유형을 지정하는 쿼리를 만듭니다.
자세한 내용은 WQL을 사용하여 쿼리를 참조하세요.
__FilterToConsumerBinding 인스턴스를 만들어 필터를 NTEventLogEventConsumer 인스턴스와 연결합니다.
Mofcomp.exe를 사용하여 MOF 파일을 컴파일합니다.
예
이 섹션의 예제는 MOF 코드에 있지만 WMI용 스크립팅 API 또는 WMI용 COM API를 사용하여 프로그래밍 방식으로 인스턴스를 만들 수 있습니다. 이 예제에서는 NTEventLogEventConsumer를 사용하여 응용 프로그램 이벤트 로그에 쓸 소비자를 만드는 방법을 보여 줍니다. MOF는 "NTLogCons_Example"이라는 새 클래스, 이 새 클래스의 인스턴스에서 만들기와 같은 작업을 쿼리하는 이벤트 필터 및 필터와 소비자 간의 바인딩을 만듭니다. MOF의 마지막 작업은 NTLogCons_Example 인스턴스를 만드는 것이므로 Eventvwr.exe 실행하여 응용 프로그램 이벤트 로그에서 이벤트를 즉시 볼 수 있습니다.
EventID=0x0A for SourceName="WinMgmt"
은(는) 다음 텍스트로 메시지를 식별합니다. "%1", "%2", "%3"은 InsertionStringTemplates 배열에 지정된 해당 문자열의 자리 표시자입니다.
Event filter with query "%2" could not be [re]activated in
namespace "%1" because of error %3. Events may not be delivered
through this filter until the problem is corrected.
다음 절차에서는 예제를 사용하는 방법을 설명합니다.
예제를 사용하려면
아래 나열된 MOF 목록을 텍스트 파일에 복사하고 .mof 확장명으로 저장합니다.
명령 창에서 다음 명령을 사용하여 MOF 파일을 컴파일합니다.
Mofcomp filename**.mof**
Run Eventvwr.exe. 응용 프로그램 이벤트 로그를 찾습니다. ID = 10(EventID), Source = "WMI", Type = Error가 있는 이벤트가 표시됩니다.
이벤트 열에 10이 있는 WMI의 정보 유형 메시지를 두 번 클릭합니다. 이벤트에 대한 다음 설명이 표시됩니다.
Event filter with query "STRING2" could not be [re]activated in namespace "STRING1" because of error STRING3. Events cannot be delivered through this filter until the problem is corrected.
// Set the namespace as root\subscription.
// The NTEventLogEventConsumer is already
// compiled in the root\subscription namespace.
#pragma namespace ("\\\\.\\Root\\subscription")
class NTLogCons_Example
{
[key] string name;
string InsertionString;
};
// Create an instance of the NT Event log consumer
// and give it the alias $CONSUMER
instance of NTEventLogEventConsumer as $CONSUMER
{
// Unique instance name
Name = "NTConsumerTest";
// System component that generates the event
SourceName = "WinMgmt";
// Event message WBEM_MC_CANNOT_ACTIVATE_FILTER
EventID = 0xC000000A;
// EVENTLOG_ERROR_TYPE
EventType = 1;
// WMI event messages do not have multiple categories
Category = 0;
// Number of strings in InsertionStringTemplates property
NumberOfInsertionStrings = 3;
InsertionStringTemplates =
{"%TargetInstance.Name%",
"%TargetInstance.InsertionString%",
"STRING3"};
};
// Create an instance of the event filter
// and give it the alias $FILTER
// The filter queries for any instance operation event
// for instances of the NTLogCons_Example class
instance of __EventFilter as $FILTER
{
// Unique instance name
Name = "NTLogConsFilter";
Query = "SELECT * from __InstanceOperationEvent"
" WHERE TargetInstance ISA \"NTLogCons_Example\"";
QueryLanguage = "WQL";
};
// Create an instance of the binding
// between filter and consumer instances.
instance of __FilterToConsumerBinding
{
Consumer = $CONSUMER;
Filter = $FILTER;
};
// Create an instance of this class right now.
instance of NTLogCons_Example
{
Name = "STRING1";
InsertionString = "STRING2";
};
관련 항목