2011-08-12 33 views
8

Cố gắng sử dụng NLog để gửi các bản ghi được mã hóa JSON ra khỏi ứng dụng C# của chúng tôi, để đưa chúng vào CouchDB. Tuy nhiên, bằng cách sử dụng mục tiêu Mạng, tôi dường như không thể tìm cách đặt tiêu đề Kiểu nội dung chính xác; và CouchDB sẽ không có bất cứ điều gì để làm với đầu vào của tôi nếu không.Nhận NLog gửi JSON với các tiêu đề thích hợp?

CouchDB là out-of-the-box, hiện tại NLog config:

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

Và HTTP thô (hostname chỉnh sửa):

POST http://127.0.0.1:5984/logger/ HTTP/1.1 
Host: 127.0.0.1:5984 
Content-Length: 221 
Expect: 100-continue 

{ "date":"2011-08-12 13:38:06.4603","level":"Info","message":{"backlog":0, "too_busy":0, "io_threads":1000, "threads":32766, "messages_processed":0}, "ProcessName": "foobar"} 
+0

Hãy đăng những gì bạn có trong điều khoản của mã và cấu hình cho cả ứng dụng và CoucheDb – Brook

+0

Sửa với nói cấu hình – acp

Trả lời

4

Nhìn vào HttpNetworkSendersource, I don' t thấy cách rõ ràng để chuyển vào loại nội dung tới số WebRequest.

Tôi nghĩ bạn sẽ phải tạo mục tiêu tùy chỉnh dựa trên NetworkTarget sử dụng tùy chỉnh HttpNetworkSender và bao gồm cấu hình để đặt loại nội dung trên WebRequest một cách thích hợp.

+0

Hoặc nếu bạn muốn nhận được thực sự điên rồ, bạn có thể thử và nhúng toàn bộ Hội thoại HTTP vào bố cục, sau đó đặt địa chỉ thành TCP. Không chắc chắn nếu điều đó sẽ làm việc, có thể là thú vị mặc dù. – Brook

+0

Vá HttpNetworkSender thật dễ dàng, điều đó đã làm được điều đó. – acp

+0

Bạn có muốn đóng góp bản vá cho cộng đồng không? Tôi gặp vấn đề tương tự. Cảm ơn! – Dan

0

Trong trường hợp ai đó vẫn vấp ngã về điều này, đây là bản demo đơn giản cho mục tiêu http tùy chỉnh (NLog v4.x.x).

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")); 
} 

Từ mã cấu hình:

var asyncWebTarget = new AsyncTargetWrapper() 
{ 
    Name = "web_batch_logServer", 
    BatchSize = 100, 
    TimeToSleepBetweenBatches = 1000, 
    OverflowAction = AsyncTargetWrapperOverflowAction.Grow, 
    WrappedTarget = new WebPostTarget { ServerUrl = logServerUrl } 
}; 
Các vấn đề liên quan