/// <summary> /// Writes the specified entry to the event log writers, /// </summary> /// <param name="level">The error level.</param> /// <param name="source">The message source.</param> /// <param name="message">The message.</param> private void WriteEntry(EventLogLevel level, string source, string message) { DiagnosticsRequestContextData context = DiagnosticsRequestContext.GetContext(); string userName = string.Empty; long tenantId = -1; string tenantName = string.Empty; if (context != null) { userName = context.UserName; tenantId = context.TenantId; tenantName = context.TenantName; } // Truncate messages longer than 10000 chars if (message != null && message.Length > MaximumMessageSize) { message = message.Substring(0, MaximumMessageSize); } // Create an event log entry and pass it the writers. var logEntry = new EventLogEntry(DateTime.UtcNow, Stopwatch.GetTimestamp(), level, Thread.CurrentThread.ManagedThreadId, source ?? string.Empty, message ?? string.Empty, tenantId, tenantName, userName) { Machine = _machineName, Process = _processName }; OnWriteEvent(logEntry); foreach (IEventLogWriter logWriter in _eventLogWriters) { try { logWriter.WriteEntry(logEntry); } catch (Exception ex) { // Prevent errors from one writer affecting others. Trace.TraceError($"An error occured writing a message to a log writer. Writer type {logWriter.GetType().Name}, error {ex}."); } } }
/// <summary> /// Sets the context data within the logical thread. /// </summary> /// <param name="tenantId">The tenant id.</param> /// <param name="tenantName">Name of the tenant.</param> /// <param name="userName">Name of the user.</param> public static void SetContext(long tenantId, string tenantName, string userName) { // Set the default request context data in the logical context _contextData = new DiagnosticsRequestContextData(tenantId, tenantName, userName); }
/// <summary> /// Sets the context data within the logical thread. /// </summary> /// <param name="contextData">The context data.</param> /// <remarks></remarks> public static void SetContext(DiagnosticsRequestContextData contextData) { _contextData = contextData; }
/// <summary> /// Frees the request data from the logical thread. /// </summary> public static void FreeContext() { // Free the request context data from the logical context _contextData = null; }