我的日志框架永远与我的应用程序绑定!

时间:2011-02-13 05:09:22

标签: asp.net-mvc asp.net-mvc-3 nlog

好的,所以我在看NLog。根据用法,我的应用程序将与日志框架绑定。我该如何克服这个问题?

此外,在使用NLog时,我必须为我正在使用此框架的每个类编写太多monkey-code。制作一个静态类并从我的应用程序中的任何位置访问它是一个好习惯吗?

示例:

//the monkey code
private static Logger logger = LogManager.GetCurrentClassLogger();

//the coupling.
logger.Log(/*...*/);

2 个答案:

答案 0 :(得分:7)

  1. 创建自己的日志记录界面:

    public interface IMyOwnLogger {
        void Log(string message);
    }
    
  2. 创建实施:

    public class NLogLogger : IMyOwnLogger {
        void Log(string message) {
            StackFrame frame = new StackFrame(1, false);
            Logger logger = LogManager.GetLogger(frame.GetMethod().DeclaringType.FullName);
            logger.Log(/*...*/);
        }
    }
    
  3. 将IMyOwnLogger绑定到IOC容器中的NLogLogger。

  4. 在需要的地方注入(或使用IOC.Get<IMyOwnLogger>())。
  5. 修改

    Idsa发表了关于疏忽调用类的评论。请记住,您始终可以使用堆栈跟踪:

    var method = (new StackTrace()).GetFrame(1).GetMethod()
    

    从那里提取调用类。

    修改

    这就是NLog中GetCurrentClassLogger的样子,所以在我们的类中使用StackTrace不会产生额外的开销:

    [MethodImpl(MethodImplOptions.NoInlining)]
    public static Logger GetCurrentClassLogger()
    {
        #if SILVERLIGHT
        StackFrame frame = new StackTrace().GetFrame(1);
        #else
        StackFrame frame = new StackFrame(1, false);
        #endif
    
        return globalFactory.GetLogger(frame.GetMethod().DeclaringType.FullName);
    }
    

答案 1 :(得分:2)

就个人而言,我通过使用避免将任何日志框架绑定到我的代码 我的代码TraceSourceinstrument。然后,我使用日志框架(通常是Enterprise Library的日志记录应用程序块)来“监听”运行时的跟踪输出,并对该信息执行必要的操作。 (即写入数据库,发送电子邮件等)