2

重複の可能性:
アプリケーションの起動ごとに 1 回ローリングするコードで log4net RollingFileAppender を構成する

次のように 2 つのアペンダーを作成しています。

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;
}

どちらもファイル名ログファイルが異なります。ここで、特定のアペンダーの ILog を取得したいと思います。

一般的に言えば、ILog 型の変数を 2 つ用意して、アプリケーションのあらゆる場所で特定のログ ファイルに書き込むことができるようにしたいと考えています。

アップデート

私が直面している問題の完全なコードは次のとおりです。

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 
      */
    }
  }
}
4

2 に答える 2

0

Additivity を false に設定することで解決した問題は、アペンダーが混合出力を生成する理由でした。

于 2012-09-25T13:09:31.363 に答える