ASP.NET MVC5项目中NLog MethodCall目标无效果问题咨询
我来帮你排查ASP.NET MVC 5里NLog MethodCall目标无效的问题,这类问题通常是配置细节或者关联环节出了问题,咱们一步步来:
先确认MethodCall目标的核心配置是否完整正确
从你贴的配置内容来看是截断的,MethodCall目标必须明确指定要调用的类和方法,缺一不可。正确的配置模板应该是这样的:<target xsi:type="MethodCall" name="methodCallTarget" className="YourNamespace.YourLoggerClass, YourAssemblyName" methodName="LogMethod"> <parameter name="logLevel" layout="${level}" /> <parameter name="message" layout="${message}" /> <!-- 可以根据需要添加更多参数 --> </target>这里要注意两个关键项:
className必须是完整命名空间+类名,后面跟程序集名称(如果类在当前MVC项目里,程序集就是你的项目名称)methodName要和类中的方法名完全匹配,方法参数类型要和layout输出的类型对应(比如参数是string,layout输出的就得是字符串)
确保目标被关联到日志规则
就算目标配置对了,如果没在<rules>里把日志级别和这个目标绑定,也不会生效。你需要在NLog.config里添加对应的规则:<rules> <logger name="*" minlevel="Info" writeTo="methodCallTarget" /> </rules>这里
name="*"表示匹配所有日志记录器,minlevel设置触发日志的最低级别,writeTo要和目标的name属性完全一致。开启NLog内部日志定位具体错误
你的配置里internalLogLevel="Off",建议改成Debug或者Trace,同时补全internalLogFile的完整路径(比如c:\temp\nlog-internal.log),然后运行项目,查看这个日志文件。里面会详细记录NLog加载配置、初始化目标的全过程,有没有找不到类、方法不匹配之类的错误信息,这是排查这类问题最有效的方式。验证目标类的方法是否符合要求
被调用的类方法必须是public static的,参数数量和类型要和配置里的<parameter>一一对应,比如:namespace YourMvcProjectNamespace { public static class CustomLogger { public static void LogMessage(string logLevel, string message) { // 这里写你的自定义逻辑,比如写入数据库、发送邮件等 } } }注意:尽量避免方法重载,否则NLog可能无法准确匹配到你想要的方法。
检查NuGet包版本兼容性
ASP.NET MVC 5是基于.NET Framework的项目,建议使用NLog 4.x系列的包(NLog 5+对.NET Framework的支持有一些变化),同时确保NLog、NLog.config、NLog.schema三个包的版本完全一致,避免版本不兼容导致的问题。确认配置文件的复制属性
在Visual Studio里选中NLog.config文件,打开属性窗口,把复制到输出目录设置为如果较新则复制或者始终复制,这样项目运行或发布时,配置文件会被复制到bin目录,NLog才能加载到正确的配置。
内容的提问来源于stack exchange,提问作者Mr.Kao

