.net core 2.1 log4net с несколькими средами

Я работаю над приложением .net core 2.1 и пытаюсь включить log4net для записи журналов в файлы. Я могу заставить его работать, но не могу понять, как писать в разные среды (например, тестовые / производственные), где журналы будут в разных местах.

log4net.config

<log4net>
    <root>
        <appender-ref ref="console" />
    <appender-ref ref="file" />
  </root>
  <appender name="console" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date %level - %message%newline" />
    </layout>
    <threshold value="Info" />
  </appender>
  <appender name="file" type="log4net.Appender.RollingFileAppender">
    <file value="C:\logs\TestLocation\MyLog.log" />
    <appendToFile value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="5" />
    <maximumFileSize value="100MB" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %level - %message%newline" />
    </layout>
    <threshold value="Info" />
  </appender>
</log4net>

мой метод настройки startup.cs:

loggerFactory.AddLog4Net();

Я вставляю регистратор в свой контроллер:

 public MyController(ILogger<MyController> logger)
 {
     _logger = logger;
 }

и используйте его в моем контроллере:

_logger.LogInformation("My logger worked!!!!!!!!!!!");

Все работает нормально. Я надеялся, что могу просто добавить новый файл log4net.config и назвать его log4net.Production.config, и приложение будет использовать другой файл конфигурации в зависимости от среды, в которой он находится, например appnsettings.json. Вместо этого он просто использует мой файл log4net.config по умолчанию.

Возможно ли иметь несколько файлов log4net.config для каждой среды, например appsettings.json?


person Joel    schedule 28.01.2019    source источник


Ответы (2)


У вас есть возможность использовать расширенный настраиваемая конфигурация из параметров приложения. {environment} .json.

Переопределив значение свойства Log4NetConfigFileName, вы сможете указать разные файлы log4net.config для каждой среды.

"Log4NetCore": {
    "Log4NetConfigFileName": "log4net.production.config"
}

Чтобы получить эту настраиваемую конфигурацию, вы должны заменить вызов AddLog4Net() эквивалентным вызовом метода AddLog4Net(Log4NetProviderOptions).

var loggingOptions = this.Configuration.GetSection("Log4NetCore")
                                       .Get<Log4NetProviderOptions>();
loggerFactory.AddLog4Net(loggingOptions);

Поскольку динамическая загрузка appsettings.json средой уже настроена в вашем проекте, конкретная конфигурация для вашей производственной среды должна быть выбрана автоматически.

Надеюсь это поможет.

person HuorSwords    schedule 31.01.2019
comment
Хотя я считаю, что @TiagoBrenck дал отличный ответ (который работает очень хорошо), я считаю, что это должен быть принятый ответ, поскольку он использует встроенный Log4NetCore.PropertyOverrides. - person Luc; 30.08.2019

На вашем Startup.cs вы можете настроить это следующим образом:

public Startup(IConfiguration configuration, IHostingEnvironment env)
{
    FileInfo fInfo;

    if (File.Exists(Path.Combine(env.ContentRootPath, $"log4net.{env.EnvironmentName}.xml")))
        fInfo = env.GetLog4NetFile($"log4net.{env.EnvironmentName}.xml");
    else
        fInfo = env.GetLog4NetFile($"log4net.xml");

    XmlConfigurator.Configure(fInfo);
    LogManager.GetLogger(DefaultLoggerName)?.Info($"Environment={env.EnvironmentName}"); 
    Configuration = configuration;
}

Затем вы можете создать файл, например log4net.Production.xml, и настроить его в соответствии с используемой средой.

person TiagoBrenck    schedule 28.01.2019