.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, я хочу передать регистратор в свою библиотеку классов, чтобы я мог вызывать методы библиотеки