【问题标题】:Production and development log4net configs?生产和开发 log4net 配置?
【发布时间】:2012-04-26 13:41:08
【问题描述】:

我目前正在开发一些可以在两种环境中运行的应用程序:开发或生产。我希望每个都有不同的日志记录基础设施。

环境在运行时传递给我的 .exe。如何通过代码启用/禁用相应的附加程序?下面的配置有什么需要调整的吗?

我在此 app.config 文件中有其他内容用于应用程序设置,这些内容为每个键提供一个“prod”值和一个“dev”值,基于 this,所以我不想要多个配置文件。

<log4net>

    <root>
      <level value="debug" />
      <appender-ref ref="Dev" />
      <appender-ref ref="Prod" />
    </root>

    <appender name="Dev" type="log4net.Appender.FileAppender">
      <file type="log4net.Util.PatternString" value="blabla 1" />
      <layout type="log4net.Layout.PatternLayout">
        <Header value="[Application Start]&#13;&#10;" />
        <Footer value="[Application Exit]&#13;&#10;"  />
        <ConversionPattern value="%date (%property{ActiveStatus}) %-5level [%2thread] %-20.20logger{1} %message%newline" />
      </layout>
    </appender>

    <appender name="Prod" type="log4net.Appender.FileAppender">
      <file type="log4net.Util.PatternString" value="blabla 2" />
      <layout type="log4net.Layout.PatternLayout">
        <Header value="[Application Start]&#13;&#10;" />
        <Footer value="[Application Exit]&#13;&#10;"  />
        <ConversionPattern value="%date (%property{ActiveStatus}) %-5level [%2thread] %-20.20logger{1} %message%newline" />
      </layout>
    </appender>

</log4net>

【问题讨论】:

  • 顺便说一句,您可以只将 内容移动到单独的文件中。见这里stackoverflow.com/a/445988/562906
  • 可以在运行时访问log4net配置,修改appender集合

标签: c# log4net


【解决方案1】:

您可能希望根据要发布到的环境对您的 app.config 文件进行转换。这在 Web 应用程序中很常见,但是有一个 SO 解释了如何将其扩展到其他项目类型:

App.Config Transformation for projects which are not Web Projects in Visual Studio 2010?

【讨论】:

  • +1 你绝对应该花时间让 app.config 转换工作——它们不仅适用于 log4net 配置,而且适用于 app.config 中从开发到登台再到生产的所有内容。跨度>
【解决方案2】:

我建议每个环境使用一个单独的配置文件,并在运行时加载适当的配置文件。这样可以更容易维护并避免偶尔出现的错误,例如将开发特定设置应用于生产附加程序等。

if (environment == "Production")
{
   log4net.Config.Configure(Path.Combine(productionFolder, "log4net.config"));
}

【讨论】:

  • 这仍然会导致同样的问题,因为“环境”变量/应用程序设置可能会被偶然覆盖到产品中的 dev 等等。
【解决方案3】:

我投票支持 sll 的建议。但是,如果您坚持禁用其中一个附加程序:

ILoggerRepository repository = log4net.LogManager.GetRepository();
var appender = repository.GetAppenders()
    .Where(a => a.Name == "dev")
    .Single();
appender.Close();

【讨论】:

    【解决方案4】:

    或许可以使用标签&lt;threshold value="OFF"/&gt;,或者修改一下??

    这样注释掉

    <!-- <threshold value="OFF"/> -->
    

    当您需要启用日志记录时

    【讨论】:

    • 即使我不是反对者......这个答案显然是愚蠢,因为它不适用于(几乎)自动/自动化部署......绝对没有企业解决方案!如果您在自己的机器上构建封闭设置,这可能没问题...但对于其他所有情况,这不是一个合适的解决方案!
    • 你不应该引用一个愚蠢的答案。只是“错误”。
    猜你喜欢
    • 2015-07-17
    • 2012-09-11
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多