Nlog для входа с помощью NLog API в Application Insight и хранилище таблиц - PullRequest
0 голосов
/ 22 марта 2020

Я пробую NLog для регистрации моих журналов в таблице ApplicationInsights & Az. Поскольку у меня много регионов, и я предпочитаю не хранить ключ инструментария в файлах конфигурации, я пишу проект библиотеки в. NET 4.7.1 с использованием метода, описанного ниже.

 public void AddTelemetryTarget()
        {
            try
            {
                InternalLogger.LogToConsole = true;
                // enable internal logging to a file               
                InternalLogger.LogToConsoleError = true;
                // enable internal logging to a custom TextWriter
                TextWriter writer = File.CreateText(@"D:\My Files\PayloadLog.txt");
                InternalLogger.LogWriter = writer; //e.g. TextWriter writer = File.CreateText("C:\\perl.txt")
                // set internal log level
                InternalLogger.LogLevel = NLog.LogLevel.Trace;

                LogManager.ThrowExceptions = true;
                var config = new LoggingConfiguration();
                //Registering Nlog target with application insight
                ConfigurationItemFactory.Default.Targets.RegisterDefinition("ApplicationInsightsTarget", typeof(ApplicationInsightsTarget));
                ApplicationInsightsTarget aiTarget = new ApplicationInsightsTarget();
                aiTarget.InstrumentationKey = "instrumentationKey";
                aiTarget.Name = "ai";

                var wrapper = new AsyncTargetWrapper(aiTarget, 5000, AsyncTargetWrapperOverflowAction.Grow);
                config.AddTarget("TelemetryAsyncWrapper", wrapper);
                //Applying logging rules.
                LoggingRule rule = new LoggingRule("*", ConvertLogType(LogLevel.Info), aiTarget);
                config.LoggingRules.Add(rule);

                LogFactory logFactory = new LogFactory(config);
                NLog.Logger _logger = logFactory.GetCurrentClassLogger();

                LogEventInfo logEventInfo = new LogEventInfo();
                logEventInfo.Level = NLog.LogLevel.Info;
                logEventInfo.Properties.Add("ModuleName", "TestModule");
                logEventInfo.Properties.Add("MethodName", "TestMethod");
                _logger.Info(logEventInfo);

                logEventInfo = new LogEventInfo();
                logEventInfo.Level = NLog.LogLevel.Error;
                logEventInfo.Properties.Add("ModuleName", "ExceptioModule");
                logEventInfo.Properties.Add("MethodName", "ExceptionMethod");
                _logger.Error(logEventInfo);
            }
            catch (Exception ex)
            {

                throw;
            }
        }

Но журналы не найдено в Application Insights.

Nuget Packages

Я добавил вышеупомянутые пакеты Nuget. Я что-то упустил?

Во внутренних логах тоже нет ошибок

1 Ответ

0 голосов
/ 22 марта 2020

Вы прыгаете в некоторые ловушки.

Никогда не активируйте LogManager.ThrowExceptions для производственного кода (используйте только для устранения неполадок):

LogManager.ThrowExceptions = true;

Этот конструктор никогда не должен использоваться:

LogFactory logFactory = new LogFactory(config);
NLog.Logger _logger = logFactory.GetCurrentClassLogger();

Вместо этого вы должны сделать this:

LogManager.Configuration = config;
NLog.Logger _logger = LogManager.GetCurrentClassLogger();

При написании LogEvent, вы должны включить сообщение:

var logEventInfo = new LogEventInfo(LogLevel.Info, null, "My custom message");
logEventInfo.Properties["ModuleName"] = "TestModule";
logEventInfo.Properties["MethodName"] = "TestMethod";
_logger.Log(logEventInfo);

При использовании асин c записи, вы должны помнить flu sh перед приложением -выход:

LogManager.Shutdown();
...