常见行为的nlog日志记录模式

时间:2015-05-29 09:38:17

标签: c# c#-4.0 design-patterns nlog

我在我的操作服务类中使用loggin

   public class   MyServiceImplementation : IServiceInterface
    {
           static Logger log = LogManager.GetCurrentClassLogger();

           public bool A()
           {
              try
              {
                 log.Trace("Started");                 
                 // Do something A
                 log.Trace("Completed");
                 return true;
              }
              catch( Exception e )
              {
                  log.Error(e);               
              }
              return false;
           }


           public bool B()
           {
              try
              {
                 log.Trace("Started");                 
                 // Do something B
                 log.Trace("Completed");
                 return true;
              }
              catch( Exception e )
              {
                  log.Error(e);
              }
              return false;
           }
    }

结果在log中我看到漂亮的记录为

MyServiceImplementation:B   Started
MyServiceImplementation:B   Completed
MyServiceImplementation:A   Started
MyServiceImplementation:A   Completed

但是看看代码设计,由于逻辑重复,它并不漂亮,我想写成

   public class   MyServiceImplementation : IServiceInterface
    {
           static Logger log = LogManager.GetCurrentClassLogger();

           private bool CallMethod( Action m )
           {
              try
              {
                 log.Trace("Started");                 
                 m();
                 log.Trace("Completed");
                 return true;
              }
              catch( Exception e )
              {
                  log.Error(e);               
              }
              return false;

           }

           public bool A()
           {
              return CallMethod(()=> { //Do Something A  } )
           }

           public bool A()
           {
              return CallMethod(()=> { //Do Something B  } )
           }


    }

但是在这种情况下我在日志中丢失了堆栈跟踪,有关A或B方法的信息正在调用丢失,我在所有情况下都看到了CallMethod

MyServiceImplementation:CallMethod   Started
MyServiceImplementation:CallMethod   Completed
MyServiceImplementation:CallMethod   Started
MyServiceImplementation:CallMethod   Completed

如何实现两个目标 - 漂亮的日志记录和漂亮的代码?

1 个答案:

答案 0 :(得分:0)

Decorator pattern是你的朋友。

interface Iservice{

bool A()
bool B()

}

class ServiceImpl : Iservice {

bool A(){//do something}

bool B(){//do something}

}

class LoggedServiceImpl : Iservice{

Iservice innerService:

public LoggedServiceImpl(Iservice innerServ){

innerService = innerServ;

}

public bool A(){

trace("A started");
bool res = innerService.A
trace("A ended");
return res
}

public bool B(){

trace("B started");
bool res = innerService.B
trace("B ended");
return res
}

}

Iservice myService = new ServiceImpl();
Iservice myLoggedService = new LoggedServiceImpl(Iservice);
Console.WriteLine(Iservice.A();)
Console.WriteLine(Iservice.B();)

或者您可以像PostSharp一样使用AOP库。 AOP非常适合像伐木这样的横切关注。

或者您可以使用像Microsoft Unity这样的DI容器拦截,这是一种基本的,有限的AOP,不需要AOP编译器或在二进制输出结果中发布编译器更改。