CSharp2014.05.19 18:04




오랜 시간을 Log4net을 사용하였지만 항상 아쉬운 점이 있었는데, 상속을 사용한 구조를 만들 때 Base class에 Logger를 한번만 지정하고 파생 클래스에서는 다른 정의 없이 바로 사용하는 것이었습니다.

하지만 이런 구조에서의 문제는 로그가 발생했을 때 이것을 발생시킨 클래스를 알기가 쉽지 않았습니다. 그런데 다른 별도의 방법이 존재하는 군요.

App.config



  
    

 

Child.cs

using log4net;
namespace LogTest
{
    public class Child : Parent
    {
        protected static readonly ILog childlog = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        public Child()
        {
            //childlog.Info("Child constructed!");
            parentlog.Info("Child constructed -- By ParentLog");
            GrandFatherLog.Info("Child Constructed!-- By GrandFatherLog");
        }
    }
}

 

Parent.cs

using log4net;
using System.Diagnostics;
using System.Reflection;
namespace LogTest
{
    public class Parent : GrandFather
    {
        public Parent() 
        {
            parentlog.Info("Parent constructed!");
            GrandFatherLog.Info("Parent Constructed!-- By GrandFatherLog");
        }
        public static ILog parentlog
        {
            get
            {
                StackFrame sf = new StackFrame(1, false);
                MethodBase methodBase = sf.GetMethod();
                return LogManager.GetLogger(methodBase.DeclaringType);
            }
        }
    }
}

 

GrandFather.cs

using log4net;
using System.Diagnostics;
using System.Reflection;
namespace LogTest
{
    public class GrandFather
    {
        public GrandFather()
        {
            GrandFatherLog.Info("GrandFather Constructed!");
        }
        public static ILog GrandFatherLog
        {
            get
            {
                StackFrame sf = new StackFrame(1, false);
                MethodBase methodBase = sf.GetMethod();
                return LogManager.GetLogger(methodBase.DeclaringType);
            }
        }
    }
}

 

Program.cs

using log4net;
using System;
namespace LogTest
{
    class Program
    {
        private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        static void Main(string[] args)
        {
            log4net.Config.XmlConfigurator.Configure();
            log.Info("Test Start!");
            Child newChild = new Child();
            Console.ReadKey();
        }
    }
}

 

신고




Posted by 금붕어70

티스토리 툴바