in v2/src/log_sink_etw.c [638:702]
static void log_sink_etw_log(LOG_LEVEL log_level, LOG_CONTEXT_HANDLE log_context, const char* file, const char* func, int line, const char* message_format, va_list args)
{
if (message_format == NULL)
{
/* Codes_SRS_LOG_SINK_ETW_01_001: [ If message_format is NULL, log_sink_etw.log shall return. ]*/
(void)printf("Invalid arguments: LOG_LEVEL log_level=%" PRI_MU_ENUM ", LOG_CONTEXT_HANDLE log_context=%p, const char* file=%s, const char* func=%s, int line=%d, const char* message_format=%s\r\n",
MU_ENUM_VALUE(LOG_LEVEL, log_level), log_context, file, func, line, message_format);
}
else
{
const LOG_CONTEXT_PROPERTY_VALUE_PAIR* value_pairs;
uint16_t values_count;
if (log_context != NULL)
{
/* Codes_SRS_LOG_SINK_ETW_01_048: [ If log_context is not NULL: ]*/
/* Codes_SRS_LOG_SINK_ETW_01_049: [ log_sink_etw.log shall call log_context_get_property_value_pair_count to obtain the count of properties that are to be added to the ETW event. ]*/
value_pairs = log_context_get_property_value_pairs(log_context);
/* Codes_SRS_LOG_SINK_ETW_01_050: [ log_sink_etw.log shall call log_context_get_property_value_pairs to obtain the properties that are to be added to the ETW event. ]*/
values_count = (uint16_t)log_context_get_property_value_pair_count(log_context);
}
else
{
/* Codes_SRS_LOG_SINK_ETW_01_025: [ If log_context is NULL only the fields content, file, func and line shall be added to the ETW event. ]*/
value_pairs = NULL;
values_count = 0;
}
/* Codes_SRS_LOG_SINK_ETW_01_010: [ log_sink_etw_log shall emit a self described event that shall have the name of the event as follows: ]*/
switch (log_level)
{
default:
/* Codes_SRS_LOG_SINK_ETW_01_017: [ Otherwise the event name shall be Unknown. ]*/
/* Codes_SRS_LOG_SINK_ETW_01_024: [ Otherwise the ETW logging level shall be TRACE_LEVEL_NONE. ]*/
internal_emit_self_described_event_va(event_name_unknown, sizeof(event_name_unknown), TRACE_LEVEL_NONE, value_pairs, values_count, file, func, line, message_format, args);
break;
case LOG_LEVEL_CRITICAL:
/* Codes_SRS_LOG_SINK_ETW_01_012: [ If log_level is LOG_LEVEL_CRITICAL the event name shall be LogCritical. ]*/
/* Codes_SRS_LOG_SINK_ETW_01_019: [ If log_level is LOG_LEVEL_CRITICAL the ETW logging level shall be TRACE_LEVEL_CRITICAL. ]*/
internal_emit_self_described_event_va(event_name_critical, sizeof(event_name_critical), TRACE_LEVEL_CRITICAL, value_pairs, values_count, file, func, line, message_format, args);
break;
case LOG_LEVEL_ERROR:
/* Codes_SRS_LOG_SINK_ETW_01_013: [ If log_level is LOG_LEVEL_ERROR the event name shall be LogError. ]*/
/* Codes_SRS_LOG_SINK_ETW_01_020: [ If log_level is LOG_LEVEL_ERROR the ETW logging level shall be TRACE_LEVEL_ERROR. ]*/
internal_emit_self_described_event_va(event_name_error, sizeof(event_name_error), TRACE_LEVEL_ERROR, value_pairs, values_count, file, func, line, message_format, args);
break;
case LOG_LEVEL_WARNING:
/* Codes_SRS_LOG_SINK_ETW_01_014: [ If log_level is LOG_LEVEL_WARNING the event name shall be LogWarning. ]*/
/* Codes_SRS_LOG_SINK_ETW_01_021: [ If log_level is LOG_LEVEL_WARNING the ETW logging level shall be TRACE_LEVEL_WARNING. ]*/
internal_emit_self_described_event_va(event_name_warning, sizeof(event_name_warning), TRACE_LEVEL_WARNING, value_pairs, values_count, file, func, line, message_format, args);
break;
case LOG_LEVEL_INFO:
/* Codes_SRS_LOG_SINK_ETW_01_015: [ If log_level is LOG_LEVEL_INFO the event name shall be LogInfo. ]*/
/* Codes_SRS_LOG_SINK_ETW_01_022: [ If log_level is LOG_LEVEL_INFO the ETW logging level shall be TRACE_LEVEL_INFO. ]*/
internal_emit_self_described_event_va(event_name_info, sizeof(event_name_info), TRACE_LEVEL_INFORMATION, value_pairs, values_count, file, func, line, message_format, args);
break;
case LOG_LEVEL_VERBOSE:
/* Codes_SRS_LOG_SINK_ETW_01_016: [ If log_level is LOG_LEVEL_VERBOSE the event name shall be LogVerbose. ]*/
/* Codes_SRS_LOG_SINK_ETW_01_023: [ If log_level is LOG_LEVEL_VERBOSE the ETW logging level shall be TRACE_LEVEL_VERBOSE. ]*/
internal_emit_self_described_event_va(event_name_verbose, sizeof(event_name_verbose), TRACE_LEVEL_VERBOSE, value_pairs, values_count, file, func, line, message_format, args);
break;
}
}
}