我的 nlog.config 文件中是否缺少为 Web 服务配置的设置以触发控制器中的方法?

Is there a missing setting in my nlog.config file configured for webservice to trigger method in controller?

我想将来自 Nlog 的信息发送到文件中,同时发送到网络服务。 该文件工作正常。 Web 服务不会在控制器处遇到断点。

我尝试了此处推荐的步骤 https://github.com/NLog/NLog/wiki/WebService-target, here https://github.com/NLog/NLog/issues/1996 and understood it should be doable since https://github.com/NLog/NLog/pull/1912 并使用了以下检测记录器的代码:

测试工作正常:

    DebugTarget target = new DebugTarget();
    target.Layout = "${message}";
    NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(target, LogLevel.Debug);
    Logger logger = LogManager.GetLogger("ws");
    logger.Debug("log message"); <--- here I expected to hit the breakpoint after this step
    logger.Debug("another log message");

我的Nlog.config

 <targets>      
   <target xsi:type='WebService'
      name= 'ws'
      protocol= 'HttpPost'
      url= 'http://localhost:8082/API/Nlog'
      encoding= 'UTF-8'
      preAuthenticate= 'true'
      proxyType="NoProxy">       
    <parameter name="sourceSite"        type='System.String' layout="${aspnet-request:serverVariable=Url:format=ToString}" />
    <parameter name="sourceApplication" type='System.String' layout="${iis-site-name:format=ToString}" />
    <parameter name="message"           type='System.String' layout="${message:format=ToString}" />
    <parameter name="innerException"    type='System.String' layout="${exception:format=string,message,method:maxInnerExceptionLevel=5:innerFormat=shortType,message,method}}" />
    <parameter name="level"             type='System.String' layout="${level:uppercase=true}" />
    <parameter name="stackTrace"        type='System.String' layout="${exception:format=ToString,StackTrace}${newline}" />
    <parameter name='windowsUserName'   type='System.String' layout='${windows-identity:userName=true:domain=true:format=ToString}' />        
    <header name='WindowsUserName' layout='${windows-identity:userName=true:domain=true}' />
    <header name='xapikey' layout='keyValue' />
  </target>
  <target name="file" xsi:type="File" fileName="${basedir}/log.txt"  archiveAboveSize="52428800" layout="${longdate}|${level:uppercase=true}|${logger}|${message}|${exception:format=ToString,StackTrace}${newline}"/>
</targets>
<rules>
    <logger name="*" minlevel="Off" writeTo="file"/>
    <logger name="ws" minlevel="Trace" writeTo="ws"/>
</rules>

要调用但不会命中断点的控制器:

public class NlogController : BaseController (which has BaseController : ApiController)
{        
    protected new static readonly Logger Logger = LogManager.GetCurrentClassLogger();

    /// <summary>
    /// 
    /// </summary>
    /// <param name="data"></param>
    public void Post([FromBody] NlogData data)
    { //Breakpoint placed here
        Manager.StoreLoggingInformation(data);
    }
}

NLogData 定义

public class NlogData
{
    public string SourceSite { get; set; }
    public string SourceApplication { get; set; }
    public string Message { get; set; }
    public string InnerException { get; set; }
    public string Level { get; set; }
    public string StackTrace { get; set; }
    public string WindowsUserName { get; set; }
}

我希望在我的 NlogController 中设置断点并查看里面的内容 "data"。

我是在找到有同样错误的人后才发现错误的。

第一个错误是:

protected new static readonly Logger Logger = LogManager.GetCurrentClassLogger();

同时使用

    <logger name="ws" minlevel="Trace" writeTo="ws"/>

name="*" 是正确的设置,因为 GetCurrenClassLogger 获取命名空间+类名作为名称。这就是为什么记录器从未被击中的原因。 如果你有一个命名记录器,你需要使用

Logger logger = LogManager.GetLogger("ws");

之后又出现了第二个错误

url= 'http://localhost:8082/API/Nlog'
url= 'http://localhost:Port/{Path}/Controller**/Action**' is the correct syntax. 

在这两个更改之后,我可以到达我的断点并且一切都按预期进行! 感谢您的帮助。

我希望 Nlog 团队在 https://github.com/NLog/NLog/wiki/WebService-target

示例配置:

<nlog>
<targets>
    <target type='WebService'
            name='ws'
            url='http://localhost:1234/logme' <-- change to 'http://localhost:1234/logme/Post'
            protocol='HttpPost'
            encoding='UTF-8'   >
        <parameter name='param1' type='System.String' layout='${message}'/> 
        <parameter name='param2' type='System.String' layout='${level}'/>
    </target>
</targets>
<rules>
  <logger name='*' writeTo='ws'></logger>
</rules>
</nlog>

本可以节省 2 天的工作时间。