我想将来自Nlog的信息发送到一个文件中,同时发送到一个and服务。该文件工作正常。webservice不会命中控制器上的断点。
我尝试了这里推荐的步骤https://github.com/NLog/NLog/wiki/WebService-target,这里是https://github.com/NLog/NLog/issues/1996,我知道这应该是可行的,因为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“里面是什么。
发布于 2019-09-06 16:33:42
我在找到有相同错误的人后发现了错误。
第一个错误是:
protected new static readonly Logger Logger = LogManager.GetCurrentClassLogger();在使用时
<logger name="ws" minlevel="Trace" writeTo="ws"/>name="*“是正确的设置,因为GetCurrenClassLogger获取namespace+Classname作为名称。这就是为什么记录器从未被击中的原因。如果您有一个命名记录器,则需要使用
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>可以节省两天的工作时间。
https://stackoverflow.com/questions/57804493
复制相似问题