2

Possible Duplicate:
Configure log4net RollingFileAppender in code rolling once per application start

I am creating two appenders as follows:

private RollingFileAppender GetNewFileApender()
{
  log4net.Appender.RollingFileAppender appender = new log4net.Appender.RollingFileAppender();
  appender.Name = _serviceName;
  appender.File = _configFileName;
  appender.AppendToFile = true;
  appender.MaxSizeRollBackups = 10;
  appender.MaximumFileSize = "10MB";
  appender.StaticLogFileName = true;
  appender.RollingStyle = RollingFileAppender.RollingMode.Size;
  appender.DatePattern = "yyyy.MM.dd";
  appender.Layout = new log4net.Layout.PatternLayout("%d %p %m%n");
  appender.ActivateOptions();
  return appender;
}

They both differs in file name log file. Now I would like to get ILog for the specific appender.

Generally speaking I would like to have two variables of ILog type, so that I could be able to write to the specific log file everywhere in the applications.

UPDATE

Here is the complete code of the problem I am facing with:

using System;
using System.Collections;
using log4net;
using log4net.Appender;
using log4net.Repository.Hierarchy;

namespace Log4netTest
{
  public class Logger4net 
  {
    private static ArrayList ServicesNames = new ArrayList();

    private ILog _logger;
    private string _serviceName;
    private string _configFileName;

    private Logger4net(string ServiceName)
    {
      if (ServicesNames.Contains(ServiceName))
        throw new Exception(string.Format("Service {0} exists", ServiceName));
      ServiceName = ServiceName.Trim();

      _serviceName = ServiceName;
      _configFileName = string.Format("{0}.log", _serviceName);
    }

    private RollingFileAppender GetNewFileApender()
    {
      log4net.Appender.RollingFileAppender appender = new log4net.Appender.RollingFileAppender();

      appender.Name = _serviceName;
      appender.File = _configFileName;
      appender.AppendToFile = true;
      appender.MaxSizeRollBackups = 10;
      appender.MaximumFileSize = "10MB";
      appender.StaticLogFileName = true;
      appender.RollingStyle = RollingFileAppender.RollingMode.Size;
      appender.DatePattern = "yyyy.MM.dd";

      var layout = new log4net.Layout.PatternLayout("%d %p %m%n");
      appender.Layout = layout;

      layout.ActivateOptions();
      appender.ActivateOptions();
      return appender;
    }

    public static Logger4net AddNewLogger4net(string ServiceName)
    {
      Logger4net result = new Logger4net(ServiceName);

      var newappender = result.GetNewFileApender();
      log4net.Config.BasicConfigurator.Configure(newappender);

      result._logger = log4net.LogManager.GetLogger(ServiceName);
      Logger l = (Logger)result._logger.Logger;
      l.AddAppender(newappender);

      return result;
    }

    public void AddInfo(string message)
    {
      _logger.Info(string.Format("{0}: {1}", _serviceName, message));
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
      Logger4net log1 = Logger4net.AddNewLogger4net("Service1");
      Logger4net log2 = Logger4net.AddNewLogger4net("Service2");

      log1.AddInfo("Test 1");
      log2.AddInfo("Test 2");

      /*
      in Service1.log I have:
      2012-09-25 14:49:30,666 INFO Service1: Test 1
      2012-09-25 14:49:30,666 INFO Service1: Test 1
      2012-09-25 14:49:30,666 INFO Service2: Test 2

      in Service2.log I have:
      2012-09-25 14:49:30,666 INFO Service1: Test 1
      2012-09-25 14:49:30,666 INFO Service2: Test 2
      2012-09-25 14:49:30,666 INFO Service2: Test 2
       * 
       * i would like to have Test 1 in Service1.log and Test 2 in Service2.log 
      */
    }
  }
}
Community
  • 1
  • 1
John
  • 1,834
  • 5
  • 32
  • 60
  • Any specific reason, you want in code? log4net is excellent in providing flexible configuration support – Tilak Sep 25 '12 at 11:40
  • yep, because I need to log to multiple files and it depends on the specific logic in the application. – John Sep 25 '12 at 11:49
  • Similar question is asked here http://stackoverflow.com/a/11801900/649524 – Tilak Sep 25 '12 at 11:54
  • @Tilak, I just don't get how that appender form your link is linked with the logger? Where and how i do it? I have to configure it sa that only 1 appender is linked to a logger, and another one with another logger... – John Sep 25 '12 at 12:09
  • you can create multiple loggers, and call the statement log4net.Config.BasicConfigurator.Configure(appender); with each appenders. – Tilak Sep 25 '12 at 13:42

2 Answers2

1

use GetLogger method of the log4net.LogManager class to get a variable of ILog type specifying the logger name or type as input parameter. For example you can create an ILog static object with this code:

private static readonly ILog log = LogManager.GetLogger(loggerName)

to use a specific appender you must create a specific logger object.

Riccardo
  • 1,490
  • 2
  • 12
  • 22
  • Could you please tell me how to create that logger object? – John Sep 25 '12 at 12:24
  • personally i add to my project a .log4net.config file where i add a log4net section with all appender informations required in xml format. After this i create a new class named for example MyConfigClass which contains a FileInfo object referencing to my log4net.config file. At the end i use as parameter of GetLogger method this: typeof(MyConfigClass) – Riccardo Sep 25 '12 at 12:47
  • Could you take a look at the code I have posted in the end of my post? – John Sep 25 '12 at 13:01
0

The problem I had solved by setting Additivity to false, that was the reason why appenders were generating mixed output.

John
  • 1,834
  • 5
  • 32
  • 60