在对象初始化的时候,通过程式配置 log4net 的 appender,使得一个对象实例对应一个 log4net appender。
C# 代码如下:
Class1.cs
private ILog log = null;
private string name = null;
private RollingFileAppender rfa = null;
public Class1()
{
}
public Class1(string name)
{
this.name = name;
this.log = LogManager.GetLogger(name);
rfa = new RollingFileAppender();
rfa.Name = name;
rfa.File = @"E:\abc_"+name+@".log_";
rfa.AppendToFile = true;
rfa.RollingStyle = RollingFileAppender.RollingMode.Date;
rfa.SecurityContext = new log4net.Util.WindowsSecurityContext();
rfa.StaticLogFileName = false;
rfa.LockingModel = new FileAppender.MinimalLock();
rfa.Layout = new log4net.Layout.PatternLayout("%d %m%n");
rfa.DatePattern = "yyyy-MM-dd";
rfa.ActivateOptions();
Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
Logger coreLogger = hierarchy.GetLogger(name) as Logger;
coreLogger.Additivity = false;
coreLogger.AddAppender(rfa);
coreLogger.Level = log4net.Core.Level.Debug;
BasicConfigurator.Configure();
}
public void LogFile()
{
this.log.Info("hello! - " + name);
}
private string name = null;
private RollingFileAppender rfa = null;
public Class1()
{
}
public Class1(string name)
{
this.name = name;
this.log = LogManager.GetLogger(name);
rfa = new RollingFileAppender();
rfa.Name = name;
rfa.File = @"E:\abc_"+name+@".log_";
rfa.AppendToFile = true;
rfa.RollingStyle = RollingFileAppender.RollingMode.Date;
rfa.SecurityContext = new log4net.Util.WindowsSecurityContext();
rfa.StaticLogFileName = false;
rfa.LockingModel = new FileAppender.MinimalLock();
rfa.Layout = new log4net.Layout.PatternLayout("%d %m%n");
rfa.DatePattern = "yyyy-MM-dd";
rfa.ActivateOptions();
Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
Logger coreLogger = hierarchy.GetLogger(name) as Logger;
coreLogger.Additivity = false;
coreLogger.AddAppender(rfa);
coreLogger.Level = log4net.Core.Level.Debug;
BasicConfigurator.Configure();
}
public void LogFile()
{
this.log.Info("hello! - " + name);
}
注意:
1. 粉红色的语句如果不加上去就会抛出 NullReferenceException 异常。
2. 绿色的语句是使当前对象实例的 logger 区别于包含 root logger 在内的其他 logger,用 name 的值来区分,并且去掉 appender 之间的继承关系。如果不去掉继承关系,则后创建的对象实例所产生的 log 信息会附加到前面创建的所有对象实例的 log 文件中。
3. BasicConfigurator.Configure(appender) 方法的作用是配置 root logger 的 appender,在这个应用中用不到 root logger。
Program.cs (Console Application)
public static void LogTest()
{
Class1 c = new Class1("log1");
c.LogFile();
Class1 c1 = new Class1("log2");
c1.LogFile();
Class1 c2 = new Class1("log3");
c2.LogFile();
c1.LogFile();
c2.LogFile();
c1.LogFile();
c.LogFile();
}
static void Main(string[] args)
{
Console.WriteLine(DateTime.Now);
Program.LogTest();
Console.ReadKey();
}
{
Class1 c = new Class1("log1");
c.LogFile();
Class1 c1 = new Class1("log2");
c1.LogFile();
Class1 c2 = new Class1("log3");
c2.LogFile();
c1.LogFile();
c2.LogFile();
c1.LogFile();
c.LogFile();
}
static void Main(string[] args)
{
Console.WriteLine(DateTime.Now);
Program.LogTest();
Console.ReadKey();
}
运行后得到:
E:\abc_log1.log_2007-09-18
E:\abc_log2.log_2007-09-18
E:\abc_log3.log_2007-09-18
追加说明:需要为 Class1 追加析构函数,以释放 appender 占据的资源。
~Class1()
{
this.rfa.Close();
}
{
this.rfa.Close();
}