Udostępnij za pośrednictwem


Identyfikatory zdarzeń (rejestrowanie zdarzeń)

Identyfikatory zdarzeń jednoznacznie identyfikują określone zdarzenie. Każde źródła zdarzeń może definiować własne zdarzenia numerowane i ciągi opisu, do których są mapowane w pliku komunikatu. Osoby przeglądające zdarzenia mogą prezentować te ciągi użytkownikowi. Powinni pomóc użytkownikowi zrozumieć, co poszło nie tak i zasugerować, jakie działania należy podjąć. Skierować opis do użytkowników rozwiązując własne problemy, a nie administratorów ani techników pomocy technicznej. Aby uzyskać więcej informacji, zobacz wskazówki dotyczące komunikatów o błędach .

Format

Na poniższym diagramie przedstawiono format identyfikatora zdarzenia.

  3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
 +---+-+-+-----------------------+-------------------------------+
 |Sev|C|R|     Facility          |               Code            |
 +---+-+-+-----------------------+-------------------------------+

Sev

Dotkliwość. Ważność jest definiowana w następujący sposób:

00 — Powodzenie
01 — Informacje
10 — Ostrzeżenie
11 — Błąd

C

Bit klienta. Ten bit jest definiowany w następujący sposób:

0 — Kod systemu
1 — Kod klienta

R

Bit zarezerwowany.

Facility

Kod obiektu. Ta wartość może być FACILITY_NULL.

kod

Kod stanu obiektu.

Definicje komunikatów

Komunikaty są definiowane w pliku komunikatu o zdarzeniach. Ciągi opisu w pliku komunikatu zdarzenia są indeksowane według identyfikatora zdarzenia, umożliwiając Podgląd zdarzeń wyświetlanie tekstu specyficznego dla zdarzenia dla dowolnego zdarzenia na podstawie identyfikatora zdarzenia. Wszystkie opisy są zlokalizowane i zależne od języka. Aby uzyskać więcej informacji na temat tworzenia pliku komunikatów, zobacz Pliki tekstowe wiadomości.

Ciągi opisu mogą zawierać symbole zastępcze ciągu wstawiania z formularza %n, gdzie %1 wskazuje pierwszy ciąg wstawiania itd. Na przykład poniżej znajduje się przykładowy wpis w pliku .mc:

MessageId=0x4
Severity=Error
Facility=System
SymbolicName=MSG_CMD_DELETE
Language=English
File %1 contains %2, which is in error.
.

W tym przypadku bufor zwracany przez ReadEventLog zawiera ciągi wstawiania. Struktura NumStringsEVENTLOGREC ORD wskazuje liczbę ciągów wstawiania. Struktura StringOffsetEVENTLOGRECORD wskazuje lokalizację pierwszego ciągu wstawiania w buforze. Można przekazać tablicę DWORD_PTRs wskazującą adres każdego ciągu w buforze podczas wywoływania funkcji FormatMessage i wstawi ciągi do komunikatu.

Ciąg opisu może również zawierać symbole zastępcze ciągów parametrów z pliku komunikatu parametru. Symbole zastępcze mają postać %%n, gdzie %%1 jest zastępowany ciągiem parametru identyfikatorem 1 itd. Jednak należy wstawić ciągi parametrów do ciągu komunikatu, który formatMessage zwraca. Zazwyczaj wywołujesz FormatMessage, aby pobrać ciąg komunikatu dla zdarzenia. Następnie przeanalizujesz ciąg komunikatu dla parametrów %%n. Jeśli komunikat zawiera co najmniej jeden parametr, załaduj wartość rejestru ParameterMessageFile dla źródła. Dla każdego parametru w ciągu komunikatu pobierz identyfikator i przekaż go do FormatMessage, aby pobrać ciąg parametru. Zastąp parametr w ciągu komunikatu ciągiem parametru, który formatMessage zwrócony.

Ciągi wstawiania

Ciągi wstawiania są opcjonalnymi ciągami niezależnymi od języka używanymi do wypełniania wartości symboli zastępczych w ciągach opisu. Ponieważ ciągi nie są zlokalizowane, ważne jest, aby te symbole zastępcze były używane tylko do reprezentowania ciągów niezależnych od języka, takich jak wartości liczbowe, nazwy plików, nazwy użytkowników itd. Długość ciągu nie może przekraczać 32 kilobajtów — 1 znaków.

Unikaj używania kilku ciągów, aby utworzyć większy opis. Ciąg wstawiania powinien być traktowany jako dane, a nie tekst. Na przykład w poniższym przykładzie pszString1 i pszString2 nie powinny być używane jako ciągi wstawiania dla pszDescription.

LPSTR pszString1 = "successfully"; 
LPSTR pszString2 = "not"; 
LPSTR pszDescription = "The user was %1 added to the database.";

W poniższym przykładzie należy użyć ciągu wstawiania pszString1 lub pszString2 w pliku pszDescription.

LPSTR pszString1 = "c:\\testapp1.c"; 
LPSTR pszString2 = "c:\\testapp2.c"; 
LPSTR pszDescription = "Access denied. Attempted to open the file %1."