NLog Configuration specifically for .net core 3.1 通过name/env指定nlog文件,开启DI
NLog Configuration specifically for .net core 3.1 specifying the nlog file by name/env, and enabling DI
如何配置 asp.net 核心 3.1 应用程序以使用 NLog,特别是设置自定义日志文件名(即 nlog.[environment].config,并为 DI 启用。我已经尝试了很多没有成功。
我知道有很多关于 nlog 配置的 SO 问题和在线文章,但我似乎找不到适合我的特定场景和要求的示例。我愿意使用替代方法,例如通过 appsettings.[env].json 配置,但想避免使用多个 web.config 文件
我尝试过的一个例子:
public static void Main(string[] args)
{
var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var logFile = "nlog.config";
if (environment.Contains("Debug") || environment.Contains("Local"))
logFile = "nlog.debug.config";
// logger works only in Main() method, not as DI
var logger = NLogBuilder.ConfigureNLog(logFile).GetCurrentClassLogger();
logger.Info("Starting My App");
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.Sources.Clear();
var env = hostingContext.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json",
optional: true, reloadOnChange: true);
config.AddEnvironmentVariables();
if (args != null)
{
config.AddCommandLine(args);
}
})
...
.ConfigureLogging((hostingContext, logging) =>
{
logging.ClearProviders();
logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Debug);
logging.AddConsole();
})
.UseNLog(config); // << config has error, I can't seem to find a way to instanciate config.
}
有点棘手。除了我的主要 NLog 配置文件外,我还有两个 NLog 配置文件。这些文件是 nlog.Production.config
和 nlog.NonProduction.config
。在主 NLog 文件中,我使用了这一行:
<include file="nlog.${when:when='${environment:ASPNETCORE_ENVIRONMENT}'=='Production':inner=Production:else=NonProduction}.config" />
根据环境,其中包含其中一个文件。
另请参阅:https://github.com/NLog/NLog/wiki/XML-config-include-Example
您还可以考虑将 environment-specific 设置置于默认 appsettings.json
中并用 appsettings.[environment].json
覆盖。然后只需使用 NLog.config
中的 ${configsetting} 来加载活动设置。
如果你使用这个效果最好:
var logger = NLog.LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger();
logger.Info("Starting My App");
并且不再使用这个:
var logger = NLogBuilder.ConfigureNLog(logFile).GetCurrentClassLogger();
logger.Info("Starting My App");
另请参阅:https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-3
另请参阅:https://github.com/NLog/NLog.Extensions.Logging/wiki/NLog-configuration-with-appsettings.json
如何配置 asp.net 核心 3.1 应用程序以使用 NLog,特别是设置自定义日志文件名(即 nlog.[environment].config,并为 DI 启用。我已经尝试了很多没有成功。
我知道有很多关于 nlog 配置的 SO 问题和在线文章,但我似乎找不到适合我的特定场景和要求的示例。我愿意使用替代方法,例如通过 appsettings.[env].json 配置,但想避免使用多个 web.config 文件
我尝试过的一个例子:
public static void Main(string[] args)
{
var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var logFile = "nlog.config";
if (environment.Contains("Debug") || environment.Contains("Local"))
logFile = "nlog.debug.config";
// logger works only in Main() method, not as DI
var logger = NLogBuilder.ConfigureNLog(logFile).GetCurrentClassLogger();
logger.Info("Starting My App");
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.Sources.Clear();
var env = hostingContext.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json",
optional: true, reloadOnChange: true);
config.AddEnvironmentVariables();
if (args != null)
{
config.AddCommandLine(args);
}
})
...
.ConfigureLogging((hostingContext, logging) =>
{
logging.ClearProviders();
logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Debug);
logging.AddConsole();
})
.UseNLog(config); // << config has error, I can't seem to find a way to instanciate config.
}
有点棘手。除了我的主要 NLog 配置文件外,我还有两个 NLog 配置文件。这些文件是 nlog.Production.config
和 nlog.NonProduction.config
。在主 NLog 文件中,我使用了这一行:
<include file="nlog.${when:when='${environment:ASPNETCORE_ENVIRONMENT}'=='Production':inner=Production:else=NonProduction}.config" />
根据环境,其中包含其中一个文件。
另请参阅:https://github.com/NLog/NLog/wiki/XML-config-include-Example
您还可以考虑将 environment-specific 设置置于默认 appsettings.json
中并用 appsettings.[environment].json
覆盖。然后只需使用 NLog.config
中的 ${configsetting} 来加载活动设置。
如果你使用这个效果最好:
var logger = NLog.LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger();
logger.Info("Starting My App");
并且不再使用这个:
var logger = NLogBuilder.ConfigureNLog(logFile).GetCurrentClassLogger();
logger.Info("Starting My App");
另请参阅:https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-3
另请参阅:https://github.com/NLog/NLog.Extensions.Logging/wiki/NLog-configuration-with-appsettings.json