.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?

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 по среде уже настроена для вашего проекта, конкретная конфигурация для вашей производственной среды должна приниматься автоматически.

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

На ваше 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 и настроить его в соответствии с используемой средой.

Ты нашел ответ?

На самом деле я создал одну многократно используемую библиотеку классов, но в ней я статически передаю файл log4net.config для чтения.

теперь я использую asp.net core 3.1, я хочу передать регистратор в свою библиотеку классов, чтобы я мог вызывать методы библиотеки

Другие вопросы по тегам