Метод трассировки Не реализовано исключение в Nlog TraceWriter - PullRequest
0 голосов
/ 24 января 2020

Я работаю над проектом ASP. NET на основе NLog TraceWriter (NLogTraceWriter). Ведение журнала работало нормально, пока я не добавил конфигурацию для синхронизации c логов в Elasti c Поиск. В настоящее время я получаю следующее исключение при запуске сайта из диспетчера IIS

Метод 'Трассировка' в типе 'XXXXXXXX.App_Start.NLogTraceWriter' из сборки 'XXXXXXXX, Версия = 1.0.0.0, Культура = нейтральная, PublicKeyToken = null 'не имеет реализации

Ниже приведен мой класс TraceWriter: NLogTraceWriter.cs

public 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.Debug, classLogger.Debug},
                    {TraceLevel.Error, classLogger.Error},
                    {TraceLevel.Fatal, classLogger.Fatal},
                    {TraceLevel.Warn, 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);
            }

            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());
        }
    }

Конфигурация Nlog:

<nlog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <variable name="projectName" value="XXXXX" />
    <variable name="filePath" value="OUR_CUSTOM_FILEPATH" />
    <variable name="archiveFilePath" value="OUR_CUSTOM_FILEPATH" />
    <variable name="elasticUrl" value="OUR_ELASTIC_SEARCH_ENDPOINT" />
    <variable name="elasticUserName" value="XXXXXXX" />
    <variable name="elasticPwd" value="XXXXXXXXX" />
    <extensions>
      <add assembly="NLog.Targets.ElasticSearch"/>
    </extensions>
    <targets>

      <target name="logfile" xsi:type="File" createDirs="true" archiveEvery="Day" archiveNumbering="Rolling" maxArchiveFiles="30" concurrentWrites="true" archiveFileName="${archiveFilePath}${projectName}_${date:format=yyyyMMdd}.log" fileName="${filePath}${projectName}_${date:format=yyyyMMdd}.log" />
      <target name="Elastic" xsi:type="ElasticSearch" index="XXXXXIndex_${date:format=yyyyMM}"  includeAllProperties="True" uri="${elasticUrl}" requireAuth="True" username="${elasticUserName}" password="${elasticPwd}" >
        <field name="Machine" layout="${machinename}" />
        <layout type="JsonLayout" >
          <attribute name="message" layout="${message}" />
          <attribute name="level" layout="${level}" />
          <attribute name="time" layout="${longdate}" />
          <attribute name="machineName" layout="${machinename}"/>
        </layout>

      </target>
    </targets>
    <rules>
      <logger name="*" minlevel="Debug" writeTo="logfile" />
      <logger name="*" minlevel="Debug" writeTo="Elastic" />
    </rules>
</nlog>

Весь этот код работает нормально, когда я запускаю приложение из Visual Studio. Но при развертывании на ВМ и запуске приложения из диспетчера IIS я сталкиваюсь с вышеупомянутым исключением. Я проверил все пакеты и конфигурации и выглядит нормально.

Также я заметил, что перечисление TraceLevel, которое я использовал выше в NLogTraceWriter, не имеет никакого значения перечисления для метода Trace, но NLog В логгере есть метод Trace, который не отображается в словаре выше. Прошу пояснить, не является ли это причиной этой проблемы. Также, пожалуйста, помогите мне выяснить причину этой проблемы и устранить ее.

Я много исследовал эту проблему, но не смог найти какое-либо соответствующее объяснение. Пожалуйста, не отмечайте это как дубликат. Пожалуйста, направьте меня в правильном направлении.

...