Created
December 20, 2023 11:18
-
-
Save renanalencar/511d8ed2010a1c4b42a938d3b8c84583 to your computer and use it in GitHub Desktop.
Como escrever logs ETW (Event Trace for Windows) em arquivo ETL (Event Trace Log) em C++.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <windows.h> | |
#include <evntprov.h> | |
#include <stdio.h> | |
// Define o GUID para o provedor de eventos customizado | |
DEFINE_GUID(MyProviderId, | |
0x12345678, 0x1234, 0x5678, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF); | |
// Manipulador para a sessão de rastreamento | |
TRACEHANDLE g_hSession; | |
// Função para registrar eventos | |
void LogEvent(const wchar_t* message) { | |
EVENT_TRACE_HEADER traceHeader = { 0 }; | |
traceHeader.Size = sizeof(EVENT_TRACE_HEADER); | |
traceHeader.Flags = WNODE_FLAG_TRACED_GUID; | |
EVENT_INSTANCE_INFO instanceInfo = { 0 }; | |
instanceInfo.Size = sizeof(EVENT_INSTANCE_INFO); | |
// Cria um evento | |
TraceEvent(g_hSession, (PEVENT_TRACE_HEADER)&traceHeader); | |
EventWrite(MyProviderId, // GUID do provedor | |
&instanceInfo, // informações adicionais do evento | |
1, // número de eventos | |
&traceHeader, // cabeçalho do evento | |
sizeof(message), // tamanho do dado adicional | |
&message); // dado adicional (neste caso, a mensagem) | |
} | |
int main() { | |
// Configuração da sessão de rastreamento | |
EVENT_TRACE_PROPERTIES traceProperties = { 0 }; | |
traceProperties.Wnode.BufferSize = sizeof(EVENT_TRACE_PROPERTIES); | |
traceProperties.Wnode.Flags = WNODE_FLAG_TRACED_GUID; | |
traceProperties.Wnode.ClientContext = 1; // Use this context to specify the log file | |
traceProperties.LogFileMode = EVENT_TRACE_FILE_MODE_SEQUENTIAL; | |
// Defina o nome do arquivo ETL | |
wcsncpy_s(traceProperties.LogFileName, MAX_PATH, L"MyTrace.etl", MAX_PATH); | |
// Inicialização da sessão de rastreamento | |
ULONG status = StartTrace(&g_hSession, L"MyTraceSession", &traceProperties); | |
if (status != ERROR_SUCCESS) { | |
printf("Falha ao iniciar a sessão de rastreamento (%lu)\n", status); | |
return 1; | |
} | |
// Registro do provedor de eventos | |
status = EventRegister(&MyProviderId, NULL, NULL, &g_hSession); | |
if (status != ERROR_SUCCESS) { | |
printf("Falha ao registrar o provedor de eventos (%lu)\n", status); | |
return 1; | |
} | |
// Log de eventos de exemplo | |
LogEvent(L"Log de evento de exemplo 1"); | |
LogEvent(L"Log de evento de exemplo 2"); | |
// Encerramento da sessão de rastreamento | |
status = ControlTrace(g_hSession, L"MyTraceSession", &traceProperties, EVENT_TRACE_CONTROL_STOP); | |
if (status != ERROR_SUCCESS) { | |
printf("Falha ao encerrar a sessão de rastreamento (%lu)\n", status); | |
return 1; | |
} | |
// Encerramento do provedor de eventos | |
EventUnregister(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment