博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
日志收集系统
阅读量:6867 次
发布时间:2019-06-26

本文共 3708 字,大约阅读时间需要 12 分钟。

1:背景

  最近公司说,咱们业务系统那么多,每个系统都在写自己的日志,不方便查看和管理。

  于是,想搞个日志收集系统。

2:构思

  

3:实现

  a):收集服务

    收集服务采用ServiceStack框架,提供web api 的方式访问。

    客户端调用服务,直接把日志信息丢到消息队列中    

public AopResult
Get(LogRequest obj) { if (obj == null) return AopResult.Fail
("参数不正确!"); if (string.IsNullOrEmpty(obj.AppNo)) return AopResult.Fail
("请提供应用编号!"); if (string.IsNullOrEmpty(obj.Tag)) return AopResult.Fail
("请提供应用标签!"); if (string.IsNullOrEmpty(obj.Content)) return AopResult.Fail
("请提供日志内容!"); LogQueueHelper.EnQueue(ParserImp.Parser(obj)); return AopResult.Success(0); }
View Code

 

  b):读取日志并创建写入任务

    考虑到日志量过大,需要分表的操作,因此,在日志系统中,创建一个基表。

    基表的数据包括,日志应用,标签,队列名,表名,创建日期,是否启用等信息

public class QueueKey    {                ///         /// MongoDB 默认主键        ///         public string _id { get; set; }        ///         /// 队列名        ///         public string Key { get; set; }        ///         /// 应用        ///         public string AppNo { get; set; }        ///         /// 标签        ///         public string Tag { get; set; }        ///         /// 当前集合名称        ///         public string CollectionName { get; set; }        ///         /// 是否启用        ///         public bool Enabled { get; set; }        ///         /// 创建时间        ///         public DateTime CreateTime { get; set; }    }
View Code

    创建一个任务,定时执行从队列中读取日志信息,并根据基表数据(缓存中),创建写入。并把写入任务放入到任务队列中。

    

public static void FlushLog()        {            while (true)            {                try                {                    if (LogQueueHelper.QueueKeys.Any())                    {                        //判断是否需要分库                        var needRe = DateTime.Now.ToString("dd") == "01";                        for (var i = 0; i < LogQueueHelper.QueueKeys.Count; i++)                        {                            var queueKey = LogQueueHelper.QueueKeys[i];                            if (needRe) queueKey = DbHelper.RefreshQueueKey(queueKey);                            var queue = LogQueueHelper.Logs[queueKey.Key];                            var length = queue.Count;                            var m = 0;                            var lst = new List
(); while (m < length) { m++; lst.Add(queue.Dequeue()); } TaskHelper.AddTask(() => DbHelper.Insert(lst, queueKey)); } } } finally { Thread.Sleep(Config.QueueConfig.QueueSleep); } } }
View Code

  c):执行日志写入任务

    创建一个任务集合,每隔2S钟,从任务队列中添加一个任务到集合,上限为5个。

    在添加任务到集合之前,判断集合中的任务,如果大于等于5个,则判断准备移除集合中已完成的任务。移除失败,跳出循环,继续下次执行。移除成功,则从队列中,取出下一个任务,启动后,添加到集合中

public static void RunTask()        {            while (true)            {                Thread.Sleep(2 * 1000);                if (RunTasks.Count >= 5)                {                    var task = RunTasks.FirstOrDefault(p => p.IsCompleted);                    if (task == null) continue;                    task.Dispose();                    RunTasks.Remove(task);                }                if (QueueTasks.Count > 0)                {                    var task = QueueTasks.Dequeue();                    task.Start();                    RunTasks.Add(task);                }            }        }
View Code

 

4:结束

  这是一个简陋的日志收集系统,欢迎大神拍砖,让我改进。

转载于:https://www.cnblogs.com/lwein/p/4950629.html

你可能感兴趣的文章
关于JDK中正则表达式
查看>>
Java代码调用Oracle的存储过程,存储函数和包
查看>>
初用MssqlOnLinux 【1】
查看>>
javascript-Event对象事件
查看>>
坑死我啊,一个WPF Adorner使用注意事项
查看>>
【OpenGL 学习笔记03】点画多边形
查看>>
洛谷——P1630 求和
查看>>
(转)Android自动打包、签名、优化、上传ANT脚本
查看>>
sh语法入门学习
查看>>
POJ 1692 Crossed Matchings【DP】
查看>>
线上故障处理深入思考
查看>>
软件架构设计学习总结(19):详解分布式系统中的session同步问题
查看>>
批处理 编译C#工程
查看>>
bzoj3380[Usaco2004 Open]Cave Cows 1 洞穴里的牛之一*
查看>>
网站静态化处理—前后端分离—中(7)
查看>>
使用ViewState[""]传递Hashtable的值
查看>>
ios图层转场动画
查看>>
产品经理——BRD,MRD,PRD
查看>>
hdu3879 网络流(经典最大获利问题)
查看>>
理解mouseover,mouseout,mouseenter,mouseleave
查看>>