【问题标题】:.net core 2.1 log4net with multip environments.net core 2.1 log4net 与多个环境
【发布时间】:2019-01-28 20:49:26
【问题描述】:

我正在开发一个 .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?

【问题讨论】:

    标签: c# .net-core log4net .net-core-2.1


    【解决方案1】:

    您可以选择使用 appsettings.{environment}.json 中的高级 custom configuration

    覆盖Log4NetConfigFileName 属性的值,您将能够为每个环境指示不同的log4net.config 文件。

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

    为了获得此自定义配置,您应该将 AddLog4Net() 调用替换为对 AddLog4Net(Log4NetProviderOptions) 方法的等效调用。

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

    由于您的项目已经配置了按环境加载的动态 appsettings.json,因此您的生产环境的具体配置应自动进行。

    希望这会有所帮助。

    【讨论】:

    • 虽然我觉得@TiagoBrenck 有一个很好的答案(效果很好),但我觉得这应该是“公认的答案”,因为它使用了内置的Log4NetCore.PropertyOverrides。跨度>
    【解决方案2】:

    在您的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 的文件,并根据使用环境进行自定义。

    【讨论】:

      猜你喜欢
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 2021-02-27
      • 2019-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多