【问题标题】:Programatically configuring log4net to write to separate log files以编程方式配置 log4net 以写入单独的日志文件
【发布时间】:2015-04-27 20:42:45
【问题描述】:

我正在关注this example 以编程方式配置 log4net。但是,由于我想分别记录信息和错误,所以我修改了设置方法如下

public static void Setup()
{
    Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();

    PatternLayout patternLayout = new PatternLayout();
    patternLayout.ConversionPattern = "%date [%thread] %-5level %logger - %message%newline";
    patternLayout.ActivateOptions();

    RollingFileAppender info = new RollingFileAppender();
    info.AppendToFile = true;
    info.File = @"c:\Info\infolog.log";
    info.Layout = patternLayout;
    info.MaxSizeRollBackups = 5;
    info.MaximumFileSize = "1GB";
    info.RollingStyle = RollingFileAppender.RollingMode.Size;
    info.StaticLogFileName = true;
    info.ActivateOptions();
    info.Name = "info";



    RollingFileAppender error = new RollingFileAppender();
    error.AppendToFile = true;
    error.File = @"c:\Error\errorlog.log" ;
    error.Layout = patternLayout;
    error.MaxSizeRollBackups = 5;
    error.MaximumFileSize = "1GB";
    error.RollingStyle = RollingFileAppender.RollingMode.Size;
    error.StaticLogFileName = true;
    error.ActivateOptions();
    error.Name = "error";

    hierarchy.Root.AddAppender(info);
    hierarchy.Root.AddAppender(error);

    MemoryAppender memory = new MemoryAppender();
    memory.ActivateOptions();
    hierarchy.Root.AddAppender(memory);

    hierarchy.Root.Level = Level.Info;
    hierarchy.Configured = true;
}

在我的代码中,我将其初始化如下

public class myclass
{
     ILog errorLog ;
     ILog infoLog ;
     public myclass()
     {
          errorLog = LogManager.GetLogger("error");
          infoLog = LogManager.GetLogger("info");       
     }


     public void LogMessage()
     {
         infoLog.Warn("warn message");
         errorLog.Error("Error message");
     }

}

问题是我打印到 infoLog 的任何内容都会打印到 infolog.log 文件和 errorlog.log 文件,反之亦然。我的配置有什么问题?

【问题讨论】:

    标签: c# logging log4net log4net-configuration log4net-appender


    【解决方案1】:

    您已将两个文件附加程序添加到 root 记录器,这意味着您创建的任何记录器都继承自该记录器。

    您需要做的是能够使用正确的附加程序获取特定的记录器。我不知道有一种方法可以像在配置中定义它们一样以编程方式定义记录器,但是有一些方法可以解决这个问题。

    一个是利用log4net缓存loggers这一事实:如果你创建一个logger并配置一次,那么当你请求同名的log​​ger时,配置的logger就会被返回。

    所以在你的代码中,在hierarchy.Configured = true; 调用之后添加这个:

    ILog log = LogManager.GetLogger("error");
    Logger logger = (Logger)log.Logger;
    logger.Additivity = false;
    logger.AddAppender(error); 
    
    log = LogManager.GetLogger("info");
    logger = (Logger)log.Logger;
    logger.Additivity = false;
    logger.AddAppender(info); 
    

    注意:Additivity = false 指示记录器不要从其父记录器(在本例中为根记录器)继承附加程序。如果您删除了根记录器配置,则不需要这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-19
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多