我创建了一个通用的实现ILogger,并在这个包装器中实现了NLog实现方法。 我的问题是我在我的解决方案中为整个namspace启用了错误严重性,但我也希望在“Employee”命名空间下对类进行信息级别诊断,因此我有另一个规则,它将此命名空间下的类设置为Info级别日志记录。但是,当我只记录错误时,会在这些命名空间下的类中记录致命错误。当我调试时,我可以看到这些类的记录器实例的IsInfoEnabled()为false? 我觉得他们配置我的包装类似乎有问题吗? 有人可以建议。
通用ILogger接口 公共接口ILogger {
bool Trace(string message, params String[] args);
bool Info(string message, params String[] args);
bool Error(string message, params String[] args);
bool Fatal(string message, params String[] args);
bool Error(string message, Exception ex, String[] args);
bool Fatal(string message, Exception ex, params String[] args);
}
ILogger接口的实现
using NLog;
class NLogImpl : ILogger
{
NLog.Logger logger = null;
public NLogImpl(string source)
{
logger = LogManager.GetLogger(source);
}
bool ILogger.Trace(string message ,params String[] args)
{
logger.Trace(BuildArgumentsWithMessage(message , args));
return true;
}...
使用通用ILogger的类 此类仅记录错误和致命消息,但不记录任何其他级别,即使在配置文件中我已启用Info此命名空间
public class MainTechDetails
{
private static ILogger logger = CommonLogger.GetLogger("MainTechDetails");
public void LogMainTechDetails()
{
logger.Trace("Sample trace message");
logger.Info("Sample informational message");
logger.Error("Sample error message");
logger.Fatal("Sample fatal error message");
}
}
我有一个目标和2个规则用于此目标
<target xsi:type="File"
name="logFile"
fileName="D:\LogInformation.log"
layout="${date} ${callsite} ${message}"/>
</targets>
<rules>
<logger name="CustomLoggingNlog.Employee.*" minlevel="Info" writeTo="logFile" />
<logger name="*" minlevel="Error" writeTo="logFile"/>
</rules>
答案 0 :(得分:1)
看起来你有一些问题:
您已为“CustomLoggingNLog.Employee。”和“”配置了日志记录规则。在示例应用程序中,您将检索名为“MainTechDetails”的记录器。您应该根据完全命名空间限定名称检索记录器:CustomLoggingNLog.Employee.MainTechDetails。或者,如果您通用实现允许它,请使用类型:
CommonLogger.GetLogger(typeof运算(MainTechDetails));
您所写的包装器将无法正确维护呼叫站点(如果您使用NLog的呼叫站点LayoutRenderer)。您可以从记录器内部获取呼叫站点,而不是将代码的呼叫站点发送到您呼叫记录器的位置。这可能不是很有用。有关如何包装NLog以保留呼叫站点的示例,请参阅此问题中的答案: