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

Sha*_*ean 9 asp.net-mvc nlog asp.net-mvc-3

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

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

例:

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

//the coupling.
logger.Log(/*...*/);
Run Code Online (Sandbox Code Playgroud)

Luk*_*Led 7

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

    public interface IMyOwnLogger {
        void Log(string message);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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(/*...*/);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将IMyOwnLogger绑定到IOC容器中的NLogLogger.

  4. 注入需要(或使用IOC.Get<IMyOwnLogger>())的地方.

编辑:

Idsa发表了关于失去召唤课的评论.请记住,您始终可以使用堆栈跟踪:

var method = (new StackTrace()).GetFrame(1).GetMethod()
Run Code Online (Sandbox Code Playgroud)

并从那里提取调用类.

编辑:

这就是GetCurrentClassLoggerNLog的样子,所以在我们的类中使用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);
}
Run Code Online (Sandbox Code Playgroud)