火星文 技术研习社

Noname Cat, Keep Thinking
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

log4net: 一个对象实例对应一份 log 文件的实现

Posted on 2007-09-18 17:46  剑廿三  阅读(735)  评论(0编辑  收藏  举报

在对象初始化的时候,通过程式配置 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);

        }

注意:

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


运行后得到:

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