in src/WebJobs.Script.WebHost/Diagnostics/AzureMonitorDiagnosticLogger.cs [61:137]
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
{
if (!IsEnabled(logLevel))
{
return;
}
// Make sure we have something to log
string formattedMessage = formatter?.Invoke(state, exception);
if (string.IsNullOrEmpty(formattedMessage) && exception == null)
{
return;
}
(string exceptionType, string exceptionMessage, string exceptionDetails) = exception.GetExceptionDetails();
if (exception != null)
{
formattedMessage = Sanitizer.Sanitize(formattedMessage);
}
// enumerate all the state values once, capturing the values we'll use below
// last one wins
string stateFunctionName = null;
if (state is IEnumerable<KeyValuePair<string, object>> stateProps)
{
foreach (var kvp in stateProps)
{
if (Utility.IsFunctionName(kvp))
{
stateFunctionName = kvp.Value?.ToString();
}
}
}
var scopeProps = _scopeProvider.GetScopeDictionaryOrNull();
string functionName = stateFunctionName;
if (string.IsNullOrEmpty(functionName))
{
if (Utility.TryGetFunctionName(scopeProps, out string scopeFunctionName))
{
functionName = scopeFunctionName;
}
}
// Build up a JSON string for the Azure Monitor 'properties' bag
StringWriter sw = new StringWriter();
using (JsonTextWriter writer = new JsonTextWriter(sw) { Formatting = Formatting.None })
{
writer.WriteStartObject();
WritePropertyIfNotNull(writer, "appName", _appServiceOptions.AppName);
WritePropertyIfNotNull(writer, "roleInstance", _roleInstance);
WritePropertyIfNotNull(writer, "message", formattedMessage);
WritePropertyIfNotNull(writer, "category", _category);
WritePropertyIfNotNull(writer, "hostVersion", _hostVersion);
WritePropertyIfNotNull(writer, "functionInvocationId", Utility.GetValueFromScope(scopeProps, ScopeKeys.FunctionInvocationId));
WritePropertyIfNotNull(writer, "functionName", functionName);
WritePropertyIfNotNull(writer, "hostInstanceId", _hostInstanceId);
WritePropertyIfNotNull(writer, "activityId", Utility.GetValueFromScope(scopeProps, ScriptConstants.LogPropertyActivityIdKey));
WritePropertyIfNotNull(writer, "level", logLevel.ToString());
WritePropertyIfNotNull(writer, "levelId", (int)logLevel);
WritePropertyIfNotNull(writer, "processId", _processId);
WritePropertyIfNotNull(writer, nameof(exceptionDetails), exceptionDetails);
WritePropertyIfNotNull(writer, nameof(exceptionMessage), exceptionMessage);
WritePropertyIfNotNull(writer, nameof(exceptionType), exceptionType);
// Only write the event if it's relevant
if (eventId.Id != 0 || !string.IsNullOrEmpty(eventId.Name))
{
WriteProperty(writer, "eventId", eventId.Id);
WriteProperty(writer, "eventName", eventId.Name);
}
writer.WriteEndObject();
}
_eventGenerator.LogAzureMonitorDiagnosticLogEvent(logLevel, _hostNameProvider.Value, AzureMonitorOperationName, AzureMonitorCategoryName, _regionName, sw.ToString());
}