h3n
h3n

Reputation: 5248

How to use 1 FileAppender for multiple Logger in log4net

Basically, I need to generate multiple log files. In my example, i have 2 loggers {logger-A, logger-B}. I find it tedious to create another fileappender for each logger. How can I re-use 1 appender for multiple loggers?

In Config

<log4net>

    <root>
      <level value="ALL" />
      <appender-ref ref="LogFileAppender" />
    </root>

    <logger additivity="false" name="logger-A">
      <level value="All"/>
      <appender-ref ref="FileAppender" />
    </logger>

    <logger additivity="false" name="logger-B">
      <level value="All"/>
      <appender-ref ref="FileAppender" />
    </logger>

    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
      <param name="File" type="log4net.Util.PatternString" value="log\all.txt" />
      <param name="AppendToFile" value="true" />

      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="2MB" />
      <staticLogFileName value="true" />

      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n" />
      </layout>

      <filter type="log4net.Filter.PropertyFilter">
        <Key value="Version" />
        <StringToMatch value="1" />
      </filter>
    </appender>

    <appender name="FileAppender" type="log4net.Appender.RollingFileAppender" >
      <param name="File" type="log4net.Util.PatternString" value="log\%property{LogName}.txt" />
      <param name="AppendToFile" value="true" />

      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="2MB" />
      <staticLogFileName value="true" />

      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n" />
      </layout>
    </appender>

  </log4net>

in C#

GlobalContext.Properties["LogName"] = string.Format("{0}", loggerName);
var logger = LogManager.GetLogger(loggerName);

Upvotes: 3

Views: 633

Answers (2)

andrew subash
andrew subash

Reputation: 51

I'm not fully understood your requirement, any how as per my understanding I'm trying to answer you.

So you have Multiple logger specified in your config like

    <logger additivity="false" name="logger-A">
      <level value="All"/>
      <appender-ref ref="FileAppender" />
    </logger>

    <logger additivity="false" name="logger-B">
      <level value="All"/>
      <appender-ref ref="FileAppender" />
    </logger>

then you have a appender with param as below

<param name="File" type="log4net.Util.PatternString" value="log\%property{LogName}.txt" />

which is seeking a string to replace {LogName}.

And you were able to get the logger name using your c# code below,

GlobalContext.Properties["LogName"] = string.Format("{0}", loggerName);
var logger = LogManager.GetLogger(loggerName);

If my above understanding is correct then you can refer link. I don't how far this is practical, but at least it would provide you a information I believe.

Upvotes: 0

Nick__Dudas
Nick__Dudas

Reputation: 886

You can use good old composition to do this and add more properties if you want to the configuration. As shown below.

public class FileAppenderX2 : AppenderSkeleton
{
    private FileAppender _output1;
    private FileAppender _output2;

    public string Output1 { get; set; }

    public string Output2 { get; set; }

    public override void ActivateOptions()
    {
        base.ActivateOptions();
        _output1 = new FileAppender() { Layout = this.Layout, File = Output1 };
        _output2 = new FileAppender() { Layout = this.Layout, File = Output2 };
        _output1.ActivateOptions();
        _output2.ActivateOptions();
    }

    public FileAppenderX2()
    {
    }

    protected override void Append(LoggingEvent loggingEvent)
    {
        _output1.DoAppend(loggingEvent);
        _output2.DoAppend(loggingEvent);
    }
}

Configuration file edits here...

  <appender name="FileX2Appender" type="{Fully Qualified Namespace}.FileAppenderX2, {Assembly Name}">
    <Output1 value="C:\output1.log"/>
    <Output2 value="C:\output2.log"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="[%date]-[%thread]-[%level]-[%logger] - %message%newline" />
    </layout>
  </appender>

Upvotes: 3

Related Questions