【问题标题】:log4net 1 appender 2 fileslog4net 1 个附加程序 2 个文件
【发布时间】:2018-06-12 11:34:10
【问题描述】:

是否有可能为 log4net 提供一个附加程序,如果它达到阈值级别,它会将信息记录到两个文件中。它是 INFO 级别,如果它是调试,它将写入除调试之外的所有内容,它写入包括调试在内的所有内容,并只保留这两个。我可以使用两个附加程序来做到这一点,但是我希望只有一个变量可以根据日志文件写入的阈值级别、仅一个或两者来计算。

 <appender name="Name" 
      type="log4net.Appender.RollingFileAppender,log4net">
      <file value="Path" />
      <treshold value="info" />
      <appendToFile value="true" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="5" />
      <maximumFileSize value="2000KB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <Header value="[Start]&#13;&#10;" />
        <Footer value="[End]&#13;&#10;" />
        <ConversionPattern value="%-5level %message%newline" />
      </layout>
    </appender>

【问题讨论】:

  • 正如您提到的,人们通常使用两个附加程序来执行此操作,每个附加程序都有自己的文件名和阈值级别。如果您的情况由于某种原因限制您只能使用一个 appender,那么一种方法是编写自己的 appender 类。从 AppenderSkeleton 派生,并让您的类拥有两个 RollingFileAppender 实例。重写 Append() 方法以将事件传递给适当的附加程序。
  • 我不能使用两个附加程序的原因是,在那种情况下,我必须在每个地方写两个 log.Foo() 语句如果我想登录到文件。为什么?因为我们的情况要求我们有两个独立的日志文件。一个用于开发人员,另一个用于 IT 支持团队。所以我选择了Nlog。我可能应该关闭这个问题?
  • 你可以让一个 log.Foo() 出现在任意数量的 appender 中。我们在我的公司有相同类型的设置,一个用于技术支持人员的日志文件,另一个用于技术支持人员。如果有帮助,我可以发布一个示例作为答案,请告诉我。
  • 是的,那肯定对我有帮助。 :)

标签: c# logging log4net


【解决方案1】:

您可以将 log4net 配置为将单独的日志消息写入两个(或更多)不同的文件。您甚至可以让每个文件使用不同的阈值。

这是一个包含两个日志文件的示例,一个名为 basic.log 包含 INFO 或更高级别的消息,另一个名为 details.log 包含 DEBUG 或更高级别的消息。该示例显示 log.Debug() 调用将其输出仅发送到 details.log 文件,而 log.Info() 调用将在两个文件中都有其输出。

这里是主程序:

class Program
{
    private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
    static void Main(string[] args)
    {
        log4net.Config.XmlConfigurator.Configure();
        log.Debug("This is a debug message");
        log.Info("This is an info message");
    }
}

还有 app.config 文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.1" />
  </startup>

  <log4net>
    <appender name="BasicFile" type="log4net.Appender.RollingFileAppender, log4net">
      <file value="C:\temp\basic.log"/>
      <threshold value="INFO"/>
      <appendToFile value="True"/>
      <layout type="log4net.Layout.PatternLayout">
        <Header value="[Start]&#13;&#10;" />
        <Footer value="[End]&#13;&#10;" />
        <ConversionPattern value="%-5level %message%newline" />
      </layout>
    </appender>

    <appender name="DetailsFile" type="log4net.Appender.RollingFileAppender, log4net">
      <file value="C:\temp\details.log"/>
      <threshold value="DEBUG"/>
      <appendToFile value="True"/>
      <layout type="log4net.Layout.PatternLayout">
        <Header value="[Start]&#13;&#10;" />
        <Footer value="[End]&#13;&#10;" />
        <ConversionPattern value="%-5level %message%newline" />
      </layout>
    </appender>

    <root>
      <level value="DEBUG"/>
      <appender-ref ref="BasicFile"/>
      <appender-ref ref="DetailsFile"/>
    </root>
  </log4net>
</configuration>

当我运行它时,c:\temp\basic.log 只有 INFO 消息,而 c:\temp\details.log 有两条消息。

【讨论】:

  • 好的,所以你按类类型初始化 log4net 变量,这可能是我的问题,我认为唯一可能的方法是通过 appender 名称获取它们。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
相关资源
最近更新 更多