c# - 如何以编程方式为 log4net 中的两个附加程序获取记录器?

标签 c# .net log4net

<分区>

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

我正在创建两个附加程序,如下所示:

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 类型的变量,这样我就可以在应用程序的任何地方写入特定的日志文件。

更新

这是我遇到的问题的完整代码:

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

最佳答案

使用 log4net.LogManager 类的 GetLogger 方法获取 ILog 类型的变量,指定记录器名称或类型作为输入参数。 例如,您可以使用以下代码创建一个 ILog 静态对象:

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

要使用特定的附加程序,您必须创建特定的记录器对象。

关于c# - 如何以编程方式为 log4net 中的两个附加程序获取记录器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12582014/

相关文章:

c# - 从 Json 字符串解析 JArray?

c# - 我应该在设计中的什么位置放置项目或应用程序范围的 TraceSwitch?

.net - 如何获得受信任/经过验证的发布者?

c# - ILogger.Log 方法 declaringType 参数

Log4Net 级别数值

c# - C# 开发人员用来表明他们对类的作者身份的约定是什么?

c# - 如何使用 Angular 在遗留应用程序中实现微前端架构

c# - .net XmlSerialize 抛出 "WriteStartDocument cannot be called on writers created with ConformanceLevel.Fragment"

c# - 棘手的 Entity Framework 一对一关系

c# - log4net 仅在调用 XmlConfigurator.Configure() 时有效