我正在关注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文件,反之亦然。我的配置有什么问题?
答案 0 :(得分:3)
您已将两个文件追加者添加到root
记录器中,这意味着您创建的任何记录器都会继承该记录器。
您需要做的是能够使用正确的appender获取特定的记录器。我不知道一种以编程方式定义记录器的方法,就像在config中定义记录器一样,但有一些方法可以解决这个问题。
一个是利用log4net缓存记录器的事实:如果您创建一个记录器并配置一次,那么当您请求具有相同名称的记录器时,将返回配置的记录器。
因此,在您的代码中,请在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
指示记录器不要从其父级继承appender,在这种情况下是根记录器。如果删除根记录器配置,则不需要这样做。