我的 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 天的工作时间。
我想将来自 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 天的工作时间。