Как внедрить NLog с помощью функции Azure

#c# #.net #.net-core #dependency-injection #nlog

#c# #.net #.net-ядро #внедрение зависимостей #nlog

Вопрос:

У меня есть следующий код для внедрения зависимостей в регистратор NLog:

 // startup.cs
[assembly: FunctionsStartup(typeof(MyApp.FunctionApp.Startup))]
namespace MyApp.FunctionApp {
    public class Startup : FunctionsStartup {
        public override void Configure(IFunctionsHostBuilder builder) {
            var nLogConfigPath = GetLogPath("nlog.config");
            
            builder.Services.AddLogging(loggingBuilder =>
            {
                var nLogOptions = new NLogAspNetCoreOptions
                {
                    RegisterHttpContextAccessor = true,
                    IgnoreEmptyEventId = true,
                    IncludeScopes = true,
                    ShutdownOnDispose = true
                };

                var logFactory = NLogBuilder.ConfigureNLog(nLogConfigPath);
                logFactory.AutoShutdown = false;

                var nLogConfig = logFactory.Configuration;
                loggingBuilder.AddNLog(nLogConfig, nLogOptions);
            });
        }
    }
}

// actual function code
public class ActualFunctionClass {
    public ActualFunctionClass (ILogger<ActualFunctionClass> logger) {
        logger.LogInformation("log stuff");
    }
}
  

В файле nlog.config у меня есть несколько целевых объектов. Как мне убедиться, что logger параметр ActualFunctionClass настроен с правильным целевым значением?

Это содержимое файла nlog.config. Для записи я хотел бы войти, используя locations-dataload-file цель.

 <?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      throwExceptions="true"
      keepVariablesOnReload="true">

  <variable name="logDirectory" value="${basedir}/logs/locations-dataload" />
  <variable name="commonLayout" value="${longdate}|${logger}|${uppercase:${level}}|${message}, ${all-event-properties:format=[key]=[value]:separator=, } ${exception}" />
  <targets>
    <target xsi:type="ApplicationInsightsTarget"
            name="locations-dataload-ai"
            layout="${commonLayout}" />

    <target xsi:type="File"
            name="locations-dataload-file"
            fileName="${logDirectory}/locations-dataload-file-${shortdate}.log"
            layout="${commonLayout}" />

    <target xsi:type="Null" name="blackhole" />
  </targets>

  <rules>
  <!--All logs, including from Microsoft-->
    <logger name="*" minlevel="Trace" writeTo="locations-dataload-ai" />

    <!--All logs, including from Microsoft-->
    <logger name="locations-dataload-local*" minlevel="Trace" writeTo="locations-dataload-ai,locations-dataload-file" />

    <!-- Skip Microsoft logs and so log only own logs -->
    <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
  </rules>

  <extensions>
    <add assembly="NLog.Web.AspNetCore"/>
    <add assembly="MyApp.Logging" />
  </extensions>
</nlog>
  

Комментарии:

1. Что не работает?

2. @Julian Регистратор в конструкторе ActualFunctionClass ничего не регистрирует. Я предполагаю, что не было указано, на какую цель входить. Но я не уверен, как указать цель в настройке DI.

3. Пожалуйста, поделитесь своей конфигурацией nlog. Вероятно, проблема в этом

4. Какая версия .net core / asp.net core?

5. Смотрите также: github.com/NLog/NLog . Расширения. Ведение журнала / проблемы / 447

Ответ №1:

Я думаю, что это неправильно:

 <logger name="locations-dataload-local*" ...
  

Имя регистратора по умолчанию является пространством имен.Имя_класса

Вы могли бы протестировать это с помощью:

измените правило на name="*"

  <logger name="*" minlevel="Trace" writeTo="locations-dataload-ai,locations-dataload-file" />
  

и добавить в свой макет ${logger} , например

 layout="${logger}|${commonLayout}" 
  

Фильтр имен будет сопоставлен с именем регистратора ${logger) . Итак, если имя регистратора является, YourNamespace.ActualFunctionClass то locations-dataload-local* оно не будет соответствовать этому.