public void Log <TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func <TState, Exception, string> formatter) { // propagate special exceptions through the EventManager var stateProps = state as IEnumerable <KeyValuePair <string, object> > ?? new Dictionary <string, object>(); string source = _categoryName ?? Utility.GetStateValueOrDefault <string>(stateProps, ScriptConstants.LogPropertySourceKey); if (exception is FunctionIndexingException && _eventManager != null) { _eventManager.Publish(new FunctionIndexingEvent("FunctionIndexingException", source, exception)); } // User logs are not logged to system logs. if (!IsEnabled(logLevel) || IsUserLog(state)) { return; } string formattedMessage = formatter?.Invoke(state, exception); // If we don't have a message, there's nothing to log. if (string.IsNullOrEmpty(formattedMessage)) { return; } IDictionary <string, object> scopeProps = _scopeProvider.GetScopeDictionary(); // Apply standard event properties // Note: we must be sure to default any null values to empty string // otherwise the ETW event will fail to be persisted (silently) string subscriptionId = _environment.GetSubscriptionId() ?? string.Empty; string appName = _environment.GetAzureWebsiteUniqueSlotName() ?? string.Empty; string summary = Sanitizer.Sanitize(formattedMessage) ?? string.Empty; string innerExceptionType = string.Empty; string innerExceptionMessage = string.Empty; string functionName = _functionName ?? Utility.ResolveFunctionName(stateProps, scopeProps) ?? string.Empty; string eventName = !string.IsNullOrEmpty(eventId.Name) ? eventId.Name : Utility.GetStateValueOrDefault <string>(stateProps, ScriptConstants.LogPropertyEventNameKey) ?? string.Empty; string functionInvocationId = Utility.GetValueFromScope(scopeProps, ScriptConstants.LogPropertyFunctionInvocationIdKey) ?? string.Empty; string hostInstanceId = _hostInstanceId; string activityId = Utility.GetStateValueOrDefault <string>(stateProps, ScriptConstants.LogPropertyActivityIdKey) ?? string.Empty; string runtimeSiteName = _environment.GetRuntimeSiteName() ?? string.Empty; string slotName = _environment.GetSlotName() ?? string.Empty; // Populate details from the exception. string details = string.Empty; if (exception != null) { if (string.IsNullOrEmpty(functionName) && exception is FunctionInvocationException fex) { functionName = string.IsNullOrEmpty(fex.MethodName) ? string.Empty : fex.MethodName.Replace("Host.Functions.", string.Empty); } (innerExceptionType, innerExceptionMessage, details) = exception.GetExceptionDetails(); innerExceptionMessage = innerExceptionMessage ?? string.Empty; } _eventGenerator.LogFunctionTraceEvent(logLevel, subscriptionId, appName, functionName, eventName, source, details, summary, innerExceptionType, innerExceptionMessage, functionInvocationId, hostInstanceId, activityId, runtimeSiteName, slotName); }
public override void Trace(TraceEvent traceEvent) { // Apply standard event properties // Note: we must be sure to default any null values to empty string // otherwise the ETW event will fail to be persisted (silently) string subscriptionId = _subscriptionId ?? string.Empty; string appName = _appName ?? string.Empty; string source = traceEvent.Source ?? string.Empty; string summary = Sanitizer.Sanitize(traceEvent.Message) ?? string.Empty; // Apply any additional extended event info from the Properties bag string functionName = string.Empty; string eventName = string.Empty; string details = string.Empty; if (traceEvent.Properties != null) { object value; if (traceEvent.Properties.TryGetValue(ScriptConstants.TracePropertyIsUserTraceKey, out value) && value is bool && (bool)value == true) { // we don't write user traces to system logs return; } if (traceEvent.Properties.TryGetValue(ScriptConstants.TracePropertyFunctionNameKey, out value) && value != null) { functionName = value.ToString(); } if (traceEvent.Properties.TryGetValue(ScriptConstants.TracePropertyEventNameKey, out value) && value != null) { eventName = value.ToString(); } if (traceEvent.Properties.TryGetValue(ScriptConstants.TracePropertyEventDetailsKey, out value) && value != null) { details = Sanitizer.Sanitize(value.ToString()); } } if (string.IsNullOrEmpty(details) && traceEvent.Exception != null) { details = Sanitizer.Sanitize(traceEvent.Exception.ToFormattedString()); } _eventGenerator.LogFunctionTraceEvent(traceEvent.Level, subscriptionId, appName, functionName, eventName, source, details, summary); }
public void Log <TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func <TState, Exception, string> formatter) { if (!IsEnabled(logLevel) || _isUserFunction) { return; } // enumerate all the state values once, capturing the values we'll use below // last one wins string stateSourceValue = null; string stateFunctionName = null; string stateEventName = null; string stateActivityId = null; if (state is IEnumerable <KeyValuePair <string, object> > stateProps) { foreach (var kvp in stateProps) { if (string.Equals(kvp.Key, ScriptConstants.LogPropertySourceKey, StringComparison.OrdinalIgnoreCase)) { stateSourceValue = kvp.Value?.ToString(); } else if (string.Equals(kvp.Key, ScriptConstants.LogPropertyIsUserLogKey, StringComparison.OrdinalIgnoreCase)) { if ((bool)kvp.Value) { return; } } else if (Utility.IsFunctionName(kvp)) { stateFunctionName = kvp.Value?.ToString(); } else if (string.Equals(kvp.Key, ScriptConstants.LogPropertyEventNameKey, StringComparison.OrdinalIgnoreCase)) { stateEventName = kvp.Value?.ToString(); } else if (string.Equals(kvp.Key, ScriptConstants.LogPropertyActivityIdKey, StringComparison.OrdinalIgnoreCase)) { stateActivityId = kvp.Value?.ToString(); } } } // propagate special exceptions through the EventManager string source = _categoryName ?? stateSourceValue; if (exception is FunctionIndexingException && _eventManager != null) { _eventManager.Publish(new FunctionIndexingEvent(nameof(FunctionIndexingException), source, exception)); } // If we don't have a message, there's nothing to log. string formattedMessage = formatter?.Invoke(state, exception); if (string.IsNullOrEmpty(formattedMessage)) { return; } var scopeProps = _scopeProvider.GetScopeDictionaryOrNull(); string functionName = _functionName ?? stateFunctionName ?? string.Empty; if (string.IsNullOrEmpty(functionName) && scopeProps?.Count > 0) { if (Utility.TryGetFunctionName(scopeProps, out string scopeFunctionName)) { functionName = scopeFunctionName; } } string invocationId = string.Empty; object scopeValue = null; if (scopeProps != null && scopeProps.TryGetValue(ScriptConstants.LogPropertyFunctionInvocationIdKey, out scopeValue) && scopeValue != null) { invocationId = scopeValue.ToString(); } // Apply standard event properties // Note: we must be sure to default any null values to empty string // otherwise the ETW event will fail to be persisted (silently) string summary = formattedMessage ?? string.Empty; string eventName = !string.IsNullOrEmpty(eventId.Name) ? eventId.Name : stateEventName ?? string.Empty; string activityId = stateActivityId ?? string.Empty; string subscriptionId = _appServiceOptions.CurrentValue.SubscriptionId ?? string.Empty; string appName = _appServiceOptions.CurrentValue.AppName ?? string.Empty; string runtimeSiteName = _appServiceOptions.CurrentValue.RuntimeSiteName ?? string.Empty; string slotName = _appServiceOptions.CurrentValue.SlotName ?? string.Empty; string innerExceptionType = string.Empty; string innerExceptionMessage = string.Empty; string details = string.Empty; if (exception != null) { // Populate details from the exception. if (string.IsNullOrEmpty(functionName) && exception is FunctionInvocationException fex) { functionName = string.IsNullOrEmpty(fex.MethodName) ? string.Empty : fex.MethodName.Replace("Host.Functions.", string.Empty); } (innerExceptionType, innerExceptionMessage, details) = exception.GetExceptionDetails(); formattedMessage = Sanitizer.Sanitize(formattedMessage); innerExceptionMessage = innerExceptionMessage ?? string.Empty; } _eventGenerator.LogFunctionTraceEvent(logLevel, subscriptionId, appName, functionName, eventName, source, details, summary, innerExceptionType, innerExceptionMessage, invocationId, _hostInstanceId, activityId, runtimeSiteName, slotName, DateTime.UtcNow); }
public void Log <TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func <TState, Exception, string> formatter) { // User logs are not logged to system logs. if (!IsEnabled(logLevel) || IsUserLog(state)) { return; } string formattedMessage = formatter?.Invoke(state, exception); // If we don't have a message, there's nothing to log. if (string.IsNullOrEmpty(formattedMessage)) { return; } IDictionary <string, object> scopeProps = DictionaryLoggerScope.GetMergedStateDictionary() ?? new Dictionary <string, object>(); // Apply standard event properties // Note: we must be sure to default any null values to empty string // otherwise the ETW event will fail to be persisted (silently) string subscriptionId = _environment.GetSubscriptionId() ?? string.Empty; string appName = _environment.GetAzureWebsiteUniqueSlotName() ?? string.Empty; string source = _categoryName ?? Utility.GetValueFromState(state, ScriptConstants.LogPropertySourceKey); string summary = Sanitizer.Sanitize(formattedMessage) ?? string.Empty; string innerExceptionType = string.Empty; string innerExceptionMessage = string.Empty; string functionName = _functionName; string eventName = Utility.GetValueFromState(state, ScriptConstants.LogPropertyEventNameKey); string functionInvocationId = Utility.GetValueFromScope(scopeProps, ScriptConstants.LogPropertyFunctionInvocationIdKey) ?? string.Empty; string hostInstanceId = _hostInstanceId; string activityId = Utility.GetValueFromState(state, ScriptConstants.LogPropertyActivityIdKey); // Populate details from the exception. string details = string.Empty; if (exception != null) { details = Sanitizer.Sanitize(exception.ToFormattedString()); if (string.IsNullOrEmpty(functionName) && exception is FunctionInvocationException fex) { functionName = string.IsNullOrEmpty(fex.MethodName) ? string.Empty : fex.MethodName.Replace("Host.Functions.", string.Empty); } Exception innerException = exception.InnerException; while (innerException != null && innerException.InnerException != null) { innerException = innerException.InnerException; } if (innerException != null) { GetExceptionDetails(innerException, out innerExceptionType, out innerExceptionMessage); } else { GetExceptionDetails(exception, out innerExceptionType, out innerExceptionMessage); } } _eventGenerator.LogFunctionTraceEvent(logLevel, subscriptionId, appName, functionName, eventName, source, details, summary, innerExceptionType, innerExceptionMessage, functionInvocationId, hostInstanceId, activityId); }