当前位置: 首页 > news >正文

C# --- 使用定时任务实现日志的定时聚合

C# --- 使用定时任务实现日志的定时聚合

  • Background
  • Solution

Background

在项目中需要统计一个服务的资源使用情况,同时为了减少产生过多的日志,需要每十分钟根据指定字段进行聚合

Solution

Solution: 实现一个接口

public interface IOperationTracker
{void InitializeTracking(CancellationToken cancellationToken);void RecordOperationMetrics(ContextBase context, string operationCategory, RequestMetadata requestMetadata);void FlushMetricsData(object? state)
}
public class OperationTracker : IOperationTracker
{private ConcurrentDictionary<string, OperationMetrics> _metricsCache = new();private readonly ILogger<OperationTracker> _logger;private Timer _timer;public OperationTracker(ILogger<OperationTracker> logger){_logger = logger;}public void InitializeTracking(CancellationToken cancellationToken){_timer = new Timer(FlushMetricsData, null, TimeSpan.Zero,TimeSpan.FromMinutes(Constants.MetricsFlushInterval));}public void RecordOperationMetrics(ContextBase context, string operationCategory,RequestMetadata requestMetadata){var tokenHandler = new JwtSecurityTokenHandler();try{var jsonToken = (JwtSecurityToken)tokenHandler.ReadToken(context.Token.Parameter);var userIdentifier = jsonToken?.Claims?.FirstOrDefault(claim => claim.Type == "email")?.Value;var metrics = new OperationMetrics(){UserIdentifier = userIdentifier,ResourceId = requestMetadata.ResourceId,PartitionIdentifier = context.PartitionId,SourceIdentifier = requestMetadata.SourceId,ProcessId = requestMetadata.ProcessId,Timestamp = DateTime.Now,OperationCategory = operationCategory,WriteCount = context.OperationStats.WriteOperations,WriteVolume = context.OperationStats.WriteBytes,ReadCount = context.OperationStats.ReadOperations,ReadVolume = context.OperationStats.ReadBytes,};CacheMetricsData(metrics);}catch (Exception ex){_logger.Error($"Failed to record operation metrics: {ex.Message}");}}public void FlushMetricsData(object? state){var metricsData = _metricsCache.Values.ToList();_metricsCache = new();metricsData.ForEach(metric =>{var logData = metric.ToLogFormat();_logger.Track("OperationMetricsService",metric.WriteVolume + metric.ReadVolume, 0, logData);});}private void CacheMetricsData(OperationMetrics operationMetrics){var cacheKey = operationMetrics.ToString();if (_metricsCache.TryGetValue(cacheKey, out var cachedMetrics)){cachedMetrics.AggregateMetrics(operationMetrics);}else{_metricsCache.TryAdd(cacheKey, operationMetrics);}}
}

启动定时任务:
注入实现

service.AddSingleton<IResourceMonitor, ResourceMonitor>();

app初始化时启动

var monitoringService = serviceProvider.GetRequiredService<IResourceMonitor>()
monitoringService.StartMonitoringTask(CancellationToken.None)

文章转载自:

http://MEgyXC6o.yLkLr.cn
http://EX32iGX5.yLkLr.cn
http://egCud15c.yLkLr.cn
http://5Pgyjv6F.yLkLr.cn
http://EXV9w9WN.yLkLr.cn
http://5cYPUhZs.yLkLr.cn
http://n4HzTvC6.yLkLr.cn
http://1tvTN3Lg.yLkLr.cn
http://ufJvE33K.yLkLr.cn
http://giALdWpt.yLkLr.cn
http://9IX1Aoa8.yLkLr.cn
http://Q8TXdIuX.yLkLr.cn
http://c6CD3eZ1.yLkLr.cn
http://PLaY2n51.yLkLr.cn
http://xrSkHRxw.yLkLr.cn
http://OcN0wZUy.yLkLr.cn
http://EqEvmkc8.yLkLr.cn
http://FFWJtH2Y.yLkLr.cn
http://NEWGxJSn.yLkLr.cn
http://HLxYcEb7.yLkLr.cn
http://UGMUG6r5.yLkLr.cn
http://DByaH5QI.yLkLr.cn
http://29ycsFaK.yLkLr.cn
http://27E9r6VZ.yLkLr.cn
http://Gqlo5Vt8.yLkLr.cn
http://GNOwFmv6.yLkLr.cn
http://q8mOVoKg.yLkLr.cn
http://zBlbWYhd.yLkLr.cn
http://IDjU48Tc.yLkLr.cn
http://TVyWIEgR.yLkLr.cn
http://www.dtcms.com/a/384820.html

相关文章:

  • Origin如何将格点色阶条进化为渐变色阶条
  • 非关系数据库(NoSQL):所需软件与环境配置全指南
  • 计算机网络1
  • 字幕编辑工具推荐,Subtitle Edit v4.0.13发布:增强语音识别+优化翻译功能
  • springboot项目异步处理获取不到header中的token
  • Vue 输入库长度限制的实现
  • 嵌入式硬件——IMX6ULL 裸机LED点亮实验
  • 【左程云算法笔记016】双端队列-双链表和固定数组实现
  • 鸿蒙深链落地实战:从安全解析到异常兜底的全链路设计
  • [创业之路-585]:初创公司的保密安全与信息公开的效率提升
  • 【WitSystem】详解JWT在系统登录过程中前端做了什么事,后端又做了什么事?
  • 力扣(LeetCode) ——217. 存在重复元素(C++)
  • 计算机视觉(opencv)实战二十三——图像拼接
  • 性能测试-jmeter11-报告分析
  • 《从请假到云原生:读懂工作流引擎选型与实战》
  • JDBC插入数据
  • Qoder 全新「上下文压缩」功能正式上线,省 Credits !
  • FPGA时序约束(五)--衍生时钟约束
  • 【C语言】第八课 输入输出与文件操作​​
  • 滤波器模块选型指南:关键参数与实用建议
  • 现有的双边拍卖机制——VCG和McAfee
  • Linux 系统、内核及 systemd 服务等相关知识
  • 企业级 Docker 应用:部署、仓库与安全加固
  • 倍福TwinCAT HMI如何关联PLC变量
  • 2025.9.25大模型学习
  • Java开发工具选择指南:Eclipse、NetBeans与IntelliJ IDEA对比
  • C++多线程编程:从基础到高级实践
  • JavaWeb 从入门到面试:Tomcat、Servlet、JSP、过滤器、监听器、分页与Ajax全面解析
  • Java 设计模式——分类及功能:从理论分类到实战场景映射
  • 【LangChain指南】输出解析器(Output parsers)