File: src\libraries\Common\src\System\Composition\Diagnostics\DebuggerTraceWriter.cs
Web Access
Project: src\src\libraries\System.Composition.Convention\src\System.Composition.Convention.csproj (System.Composition.Convention)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Diagnostics;
using System.Globalization;
using System.Text;
 
namespace System.Composition.Diagnostics
{
    internal sealed class DebuggerTraceWriter : TraceWriter
    {
        private static readonly string s_sourceName = typeof(DebuggerTraceWriter).Assembly.GetName().Name!;
 
        public override bool CanWriteInformation
        {
            get { return false; }
        }
 
        public override bool CanWriteWarning
        {
            get { return Debugger.IsLogging(); }
        }
 
        public override bool CanWriteError
        {
            get { return Debugger.IsLogging(); }
        }
 
        public override void WriteInformation(CompositionTraceId traceId, string format, params object[] arguments)
        {
            WriteEvent(TraceEventType.Information, traceId, format, arguments);
        }
 
        public override void WriteWarning(CompositionTraceId traceId, string format, params object[] arguments)
        {
            WriteEvent(TraceEventType.Warning, traceId, format, arguments);
        }
 
        public override void WriteError(CompositionTraceId traceId, string format, params object[] arguments)
        {
            WriteEvent(TraceEventType.Error, traceId, format, arguments);
        }
 
        private static void WriteEvent(TraceEventType eventType, CompositionTraceId traceId, string format, params object[] arguments)
        {
            if (!Debugger.IsLogging())
            {
                return;
            }
 
            string logMessage = CreateLogMessage(eventType, traceId, format, arguments);
            Debugger.Log(0, null, logMessage);
        }
 
        private static string CreateLogMessage(TraceEventType eventType, CompositionTraceId traceId, string format, params object[] arguments)
        {
            StringBuilder messageBuilder = new StringBuilder();
 
            // Format taken from TraceListener.TraceEvent in .NET Framework
            messageBuilder.Append($"{s_sourceName} {eventType}: {(int)traceId} : ");
 
            if (arguments == null)
            {
                messageBuilder.Append(format);
            }
            else
            {
                messageBuilder.AppendFormat(CultureInfo.InvariantCulture, format, arguments);
            }
 
            messageBuilder.AppendLine();
 
            return messageBuilder.ToString();
        }
 
        public enum TraceEventType
        {
            Error = 2,
            Warning = 4,
            Information = 8,
        }
    }
}