Nlog (.NET Standard 2.0) ItraceWriter и TraceRecord из .NET Framework недоступны - PullRequest
0 голосов
/ 22 октября 2018

При переносе моего решения на .NET Standard 2.0 из .NET Framework некоторые функции оказываются недоступными, в моем случае это ITraceWriter и TraceRecord.Для лучшего понимания это часть пакета nuget, который подается в шаблон микросервиса, поэтому этот класс содержит только словарь.Я хотел бы сохранить эту логику, но я уже прошел через несколько сайтов и сообщений без удачи.

using NLog;
using NLog.Web.AspNetCore;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Net.Http;
using System.Text;

namespace Microservices.LibCore.Util
{
    /// <summary>
    /// </summary>
    public class NLogUtil
    {
        /// <summary>
        /// </summary>
        /// <returns></returns>
        public static NlogTraceWriter getTraceWriter()
        {
            return new NlogTraceWriter();
        }

    }

    /// <summary>
    /// </summary>
    public sealed class NlogTraceWriter : ITraceWriter
    {
        private static readonly Logger classLogger = LogManager.GetCurrentClassLogger();

        private static readonly Lazy<Dictionary<TraceLevel, Action<string>>> loggingMap =
            new Lazy<Dictionary<TraceLevel, Action<string>>>(() => new Dictionary<TraceLevel, Action<string>>
                {
                    {TraceLevel.Info, classLogger.Info},
                    {TraceLevel.Verbose, classLogger.Debug},
                    {TraceLevel.Error, classLogger.Error},
                    {TraceLevel.Off, classLogger.Fatal},
                    {TraceLevel.Warning, classLogger.Warn}
                });

        private Dictionary<TraceLevel, Action<string>> Logger
        {
            get { return loggingMap.Value; }
        }

        public void Trace(HttpRequestMessage request, string category, TraceLevel level, Action<TraceRecord> traceAction)
        {
            if (level != TraceLevel.Off)
            {
                var record = new TraceRecord(request, category, level);
                traceAction(record);
                Log(record);
            }
        }

        private void Log(TraceRecord record)
        {
            var message = new StringBuilder();

            if (record.Request != null)
            {
                if (record.Request.Method != null)
                    message.Append(record.Request.Method);

                if (record.Request.RequestUri != null)
                    message.Append(" ").Append(record.Request.RequestUri.AbsoluteUri);
            }

            if (!string.IsNullOrWhiteSpace(record.Category))
                message.Append(" ").Append(record.Category);

            if (!string.IsNullOrWhiteSpace(record.Operator))
                message.Append(" ").Append(record.Operator).Append(" ").Append(record.Operation);

            if (!string.IsNullOrWhiteSpace(record.Message))
                message.Append(" ").Append(record.Message);

            if (record.Exception != null && !string.IsNullOrWhiteSpace(record.Exception.GetBaseException().Message))
                message.Append(" ").Append(record.Exception.GetBaseException().Message);

            Logger[record.Level](message.ToString());
        }

        public TraceLevel LevelFilter { get; }
    }
}
...