C# 让NLog发送带有正确头的JSON?
尝试使用NLog将JSON编码的日志从我们的C#app中发送出去,并将其转储到CouchDB中。然而,使用网络目标,我似乎找不到一种方法来正确设置内容类型头;而CouchDB则与我的输入无关 CouchDB是现成的,当前NLog配置:C# 让NLog发送带有正确头的JSON?,c#,json,logging,couchdb,nlog,C#,Json,Logging,Couchdb,Nlog,尝试使用NLog将JSON编码的日志从我们的C#app中发送出去,并将其转储到CouchDB中。然而,使用网络目标,我似乎找不到一种方法来正确设置内容类型头;而CouchDB则与我的输入无关 CouchDB是现成的,当前NLog配置: <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" throwExceptio
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" throwExceptions="true">
<variable name="FileLayout" value='{ "date":"${longdate}","level":"${level}","message":${message}}' />
<targets>
<target name="logfile" xsi:type="Network" address="http://127.0.0.1:5984/logger/" layout="${FileLayout}" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="logfile" />
</rules>
</nlog>
查看
HttpNetworkSender
,我看不到将内容类型传递给WebRequest
的明显方式
我认为您必须基于
NetworkTarget
创建一个自定义目标,它使用一个自定义HttpNetworkSender
,并包括config以适当地设置WebRequest
上的内容类型。如果有人仍然无意中发现了这一点,下面是自定义http目标(NLog v4.x.x)的简单演示
NLog版本。4.5 WebService目标能够配置自定义标头
<target xsi:type="WebService"
name="CouchDB"
url="http://127.0.0.1:5984/logger/"
protocol="JsonPost"
encoding="utf-8">
<parameter layout="FileLayout" />
<header name="Content-Type" layout="application/json" />
</target>
另请参见请发布您在应用程序和CouchedB的代码和配置方面的信息。如果您真的想发疯,您可以尝试将整个HTTP对话嵌入布局,然后将地址设置为TCP。不确定这是否有效,但可能很有趣。修补HttpNetworkSender很容易,这就成功了。您介意将修补程序贡献给社区吗?我也有同样的问题。谢谢
public class WebPostTarget : Target
{
public string ServerUrl { get; set; }
private readonly HttpClient _client = new HttpClient();
protected override void Write(LogEventInfo logEvent)
{
PostData(new [] { logEvent.AsLogModel() });
}
protected override void Write(AsyncLogEventInfo[] logEvents)
{
var data = logEvents.Select(x => x.LogEvent.AsLogModel()).ToArray();
PostData(data);
}
private void PostData(object data)
{
if (!ServerUrl.IsNullOrEmpty())
{
// add your custom headers to the client if you need to
_client.PostJsonAsync(ServerUrl, data).FireAndForget();
}
}
}
// HttpClientExtensions
public static async Task<HttpResponseMessage> PostJsonAsync(this HttpClient client, string url, object data)
{
return await client.PostAsync(url, new StringContent(data.ToJson(), Encoding.UTF8, "application/json"));
}
var asyncWebTarget = new AsyncTargetWrapper()
{
Name = "web_batch_logServer",
BatchSize = 100,
TimeToSleepBetweenBatches = 1000,
OverflowAction = AsyncTargetWrapperOverflowAction.Grow,
WrappedTarget = new WebPostTarget { ServerUrl = logServerUrl }
};
<target xsi:type="WebService"
name="CouchDB"
url="http://127.0.0.1:5984/logger/"
protocol="JsonPost"
encoding="utf-8">
<parameter layout="FileLayout" />
<header name="Content-Type" layout="application/json" />
</target>