C# 网站异步发布到日志

C# 网站异步发布到日志,c#,json,asp.net-mvc-4,logging,blockingcollection,C#,Json,Asp.net Mvc 4,Logging,Blockingcollection,我正在尝试解决如何为应用程序日志创建一个异步日志解决方案。 把这看作是一个典型的生产者-消费者问题,我想到了: 用于数据JSON序列化的消息模型: [DataContract] 公共抽象类日志消息 { [数据成员] 公共日期时间时间戳{get;set;} [数据成员] 公共Guid Id{get;set;} [数据成员] public int sentatemptcount{get;set;} } [数据合同] 公共类例外消息:LogMessage { [数据成员] 公共例外消息详细信息例外详细

我正在尝试解决如何为应用程序日志创建一个异步日志解决方案。 把这看作是一个典型的生产者-消费者问题,我想到了:

用于数据JSON序列化的消息模型:

[DataContract]
公共抽象类日志消息
{
[数据成员]
公共日期时间时间戳{get;set;}
[数据成员]
公共Guid Id{get;set;}
[数据成员]
public int sentatemptcount{get;set;}
}
[数据合同]
公共类例外消息:LogMessage
{
[数据成员]
公共例外消息详细信息例外详细信息{get;set;}
}
[数据合同]
公共类例外消息详细信息
{
[数据成员]
公共字符串消息{get;set;}
[数据成员]
公共字符串类型{get;set;}
[数据成员]
公共字符串StackTrace{get;set;}
[数据成员]
公共异常消息详细信息InnerException{get;set;}
}
Logger类,该类将被传递给需要记录的任何对象(如
异常过滤器
)。这使用
BlockingCollection
将发送到日志的消息排队

公共类LogglyLogger
{
专用只读字符串logglyUrl=”https://logs-01.loggly.com/inputs/xxxx/";
私有只读HttpClient;
私有只读阻止收集日志队列;
私有只读int maxtures=4;
公共LogglyLogger()
{
logQueue=newblockingcollection();
client=新的HttpClient();
Task.Run(异步()=>
{
foreach(logQueue.getconsumineGenumerable()中的var msg)
{
尝试
{           
等待发送消息(msg);
}
捕获(例外)
{

如果(msg.senttemptcount我最终通过更直接地控制发送内容来解决这个问题

LogMessageEvelope类有些成熟,添加了一个非序列化的
MessageTags
属性,将所需的标记传递给Loggly

//
///将日志消息发送到loggly
/// 
/// 
/// 
专用void发送消息(LogMessageEnvelope消息)
{
//生成标记列表
string tags=string.Join(“,”,message.MessageTags);
//序列化消息
JsonSerializerSettings设置=新的JsonSerializerSettings
{ 
NullValueHandling=NullValueHandling.Ignore,
};
字符串内容=
SerializeObject(消息、格式、缩进、设置);
//生成请求
HttpRequestMessage请求=新建HttpRequestMessage();
request.RequestUri=新Uri(logglyUrl);
request.Method=HttpMethod.Post;
request.Content=newstringcontent(Content,Encoding.UTF8);
request.Headers.Accept.Add(
新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
添加(“X-LOGGLY-TAG”,tags);
//发送请求
HttpClient=新的HttpClient();
client.sendaync(请求)
.ContinueWith(sendTask=>
{
//处理响应
httpresponsemessageresponse=sendTask.Result;
如果(!response.issucessStatusCode)
//处理失败的日志消息发布
});
}

您如何解决此问题?