Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 让NLog发送带有正确头的JSON?_C#_Json_Logging_Couchdb_Nlog - Fatal编程技术网

C# 让NLog发送带有正确头的JSON?

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将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" 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>