/// <summary> /// Converts Serilog traces/exceptions to application insights traces/exceptions. /// </summary> private static ITelemetry ConvertLogEventsToCustomTraceTelemetry( LogEvent logEvent, IFormatProvider formatProvider, Func<LogEvent, bool> includeLogEvent) { if (logEvent.Exception == null && includeLogEvent != null && !includeLogEvent(logEvent)) { return null; } // first create a default TraceTelemetry using the sink's default logic // .. but without the log level, and (rendered) message (template) included in the Properties ITelemetry telemetry = logEvent.Exception == null ? (ITelemetry)logEvent.ToDefaultTraceTelemetry( formatProvider, includeLogLevelAsProperty: false, includeRenderedMessageAsProperty: false, includeMessageTemplateAsProperty: false) : (ITelemetry)logEvent.ToDefaultExceptionTelemetry( formatProvider, includeLogLevelAsProperty: false, includeRenderedMessageAsProperty: false, includeMessageTemplateAsProperty: false); // and remove RequestId from the telemetry properties if (logEvent.Properties.ContainsKey("RequestId")) { ((ISupportProperties)telemetry).Properties.Remove("RequestId"); } if (logEvent.Properties.ContainsKey("OperationId")) { var operationId = logEvent.Properties["OperationId"].ToString(); ((ISupportProperties)telemetry).Properties.Remove("OperationId"); telemetry.Context.Operation.Id = operationId; } return telemetry; }