通过接口抽象 NLog 但保留日志记录 class

Abstracting NLog via an interface but retaining the logging class

我已经通过登录接口抽象出来,然后注入客户class。

当自定义 class 记录记录器名称时,如果自定义名称 class,例如

CommonLibrary.Logging.NLog

需要它说出前面方法的名字

我没有使用过这些,但是版本 4.3.9 引入了 cleanNamesOfAnonymousDelegates,版本 4.5 引入了 cleanNamesOfAsyncContinuations

NLog Callsite layout

过去,我使用一个函数在写入日志消息之前更改记录器名称,以从堆栈跟踪中过滤 out/ignore 外观日志记录函数。

internal string GetCallingMethodName()
{
    string result = "unknown";
    StackTrace trace = new StackTrace(false);
    for (int i = 0; i < trace.FrameCount; i++)
    {
        StackFrame frame = trace.GetFrame(i);
        MethodBase method = frame.GetMethod();
        Type dt = method.DeclaringType;
        if (!typeof(Logger).IsAssignableFrom(dt) && method.DeclaringType.Namespace != "<NAMESPACE TO SKIP>")
        {
            result = string.Concat(method.DeclaringType.FullName, ".", method.Name);
            break;
        }
    }
    return result;
}

我认为您喜欢 "hide" 堆栈跟踪中的程序集,如果是这样,那么您可以使用:

LogManager.AddHiddenAssembly(myAssembly)

http://nlog-project.org/documentation/v4.4.0/html/M_NLog_LogManager_AddHiddenAssembly.htm

如果您将 wrapped-logger-type 提供给 NLog-Logger-Log-method,那么它将在 callsite-logic 中被忽略。

另请参阅:

https://github.com/NLog/NLog/blob/4c0acefa3d394f768b46ac8ba0cb39a018565ce4/examples/ExtendingLoggers/LoggerWrapper/Program.cs#L72