你好,我想做一个跟踪日志为我的一些朋友 API
端点。这些日志是在调用端点时生成的。我希望以异步方式(尽可能轻量级)写入日志,以免影响我的常规逻辑的性能。
我想有一个组件是可注入的,在生成日志时可以在端点的任何地方调用。问题是我似乎没有找到合适的异步解决方案:
不需要因延误而受阻的重要服务
public interface IImportantInterface
{
Task DoSomethingUndistrubedAsync(string value);
}
**Wrapper around Redis pub-sub**
public interface IIOService{
Task PublishAsync( object obj);
}
控制器
public class Controller
{
private IImportantInterface importantService;
private Publisher publisher;
[HttpPost]
public async Task SomeEndpointAsync(){
this.publisher.Publish([some_log]);
await this.importantService.DoSomethingUndisturbedAsync([something]);
}
public Controller(IImportantInterface importantService)
{
this.importantService=importantService;
}
}
现在真正的问题来了。我该如何为我的孩子制造最小的脚印 Publisher
。我提出了3种方案,但其中两种方案因超出范围而不可行:
尝试1
任务作用域为方法的临时服务:
public class Publisher{
private IIOService writeService{get;set;}
public async Task PublishAsync(object obj){
Task t1=Task.Run(async()=>await writeService.PublishAsync(obj)); //t1 might not finished when method exits
}
}
在方法结束时,任务t1可能无法完成。
尝试2嵌入临时服务的任务
public class Publisher{ //publisher might get discarded when calling controller gets out of scope
private Task t1;
private IIOService writeService{get;set;}
public async Task PublishAsync(object obj){
t1=Task.Run(async ()=> this.IIOService.writeService(obj));
}
}
现在任务将不会在方法作用域之后被收集,但它可能不会在调用时完成 Controller
方法类超出范围
尝试3个concurrentqueue为的单例对象 Tasks
排队的人。这不会超出范围,但我什么时候才能清除这些项目?
public class Publisher{
private ConcurrentQueue<Task> Queue;
public async Task PublishAsync(object obj){
this.Queue.Enqueue();
}
}
p、 我想在一个公共的地方发布这些日志。从那个地方开始,目标是发布到一个 Redis
使用发布子功能的数据库。我应该给redis写信吗?
1条答案
按热度按时间efzxgjgh1#
您好,我正在尝试为我的一些api终结点创建跟踪日志。这些日志是在调用终结点时生成的。我希望以异步方式(尽可能轻量级)编写日志,以免影响我的常规逻辑的性能。
我强烈建议您使用一个现有的、经过全面测试的日志库,其中有许多具有现代功能,如语义日志和异步兼容的隐式状态。
现代日志库通常采用单例设计,日志保存在内存中(日志方法是同步的)。然后有一个单独的“处理器”将这些消息发布到收集器。如果您坚持要编写自己的日志框架(为什么?),我建议您采用与所有其他非常成功的日志框架相同的方法。