最近公司有个需求,要对业务日志进行记录并根据日志排查问题,以前都是使用log4net之类的日志组件来记录到文件,这种方式已经不能满足业务的需要,因为日志文件会很大,即使进行分割后,查找也是很不方便,何况现在项目基本都是分布式,会有多台应用服务器,那么就需要把多台服务器上的日志弄到一起,十分的麻烦,经过选择后ELK进入视线,测试环境也搭建了一套,现在唯一的问题就是怎么把多台服务器上的日子泵出到elstaticsearch中,我们的应用服务器都是windows,所以需要在每一台应用服务器上安装一个服务,如:NXlog之类的,经过考虑觉得这种方式太麻烦,所以决定把日志先记录到MongoDb,先实现简单的日志查询,再统一从MongoDb将数据泵出到elstaticsearch中,思路有了,开始动手测试。

第一步,插入测试数据,MongoDb数据库我是安装在本地一个linux虚拟机里,插入1000000条数据耗时8分钟,有兴趣的童鞋自己测试一下,用来存储日志完全没有问题,废话不多说了,上代码:

         static void Main(string[] args)
{
try
{
#region 插入测试数据
//var sw = new Stopwatch();
//sw.Start();
//string tableName = "InsuranceLog";
//for (var i = 0; i < 1000000; i++)
//{
// var lb = new LogBase<InsuranceLog>()
// {
// Message = new InsuranceLog
// {
// BusinessKey = i.ToString(),
// BusinessName = "政策查询" + i,
// BusinessParameters = "根据实际需要组织<xml><OrderId>AutoHome" + i + "</OrderId></xml>"
// }
// }; // InsertOneLogToMongoDbAsync(lb, tableName);
//}
//sw.Stop();
//Console.WriteLine("插入100000条数据耗时:" + sw.ElapsedMilliseconds + "ms");
#endregion #region 根据条件从1000000条数据中获取指定数据
var sw = new Stopwatch();
sw.Start();
var obj = GetList();
sw.Stop();
Console.WriteLine("从100000条数据获取指定数据耗时:" + sw.ElapsedMilliseconds + "ms");
foreach (var o in obj)
{
if (o.Message != null)
{
Console.WriteLine("调用时间:"+o.CallTime);
Console.WriteLine("业务key:" + o.Message.BusinessKey);
Console.WriteLine("业务名称:" + o.Message.BusinessName);
Console.WriteLine("业务参数:" + o.Message.BusinessParameters);
}
}
#endregion
Console.ReadKey();
}
catch (Exception ex)
{
throw;
}
} /// <summary>
/// 从MongoDb 获取数据
/// </summary>
/// <returns></returns>
static List<LogBase<InsuranceLog>> GetList()
{
try
{
var client = new MongoClient("mongodb://192.168.21.129:27017");
var database = client.GetDatabase("logs");
var collection = database.GetCollection<LogBase<InsuranceLog>>("InsuranceLog");
var b = (from x in collection.AsQueryable()
where x.CallTime.StartsWith("")
&& x.CallTime.EndsWith("")
select x).ToList();
return b;
}
catch (Exception ex)
{
throw;
}
} /// <summary>
/// 插入单条数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <param name="name"></param>
static async Task InsertOneLogToMongoDbAsync<T>(T t, string name)
{
try
{
var client = new MongoClient("mongodb://192.168.21.129:27017");
var database = client.GetDatabase("logs");
var collection = database.GetCollection<T>(name);
await collection.InsertOneAsync(t);
}
catch (Exception ex)
{
throw;
}
}

主要测试点在查询上,要根据条件快速检索出需要的数据,我测试了一下,单条数据大概是800ms左右,我的查询条件取出来38条数据,耗时842ms,

重点:日志基类,扩展性很好,支持自定义实体类

     /// <summary>
/// 日志基类
/// </summary>
[BsonIgnoreExtraElements]
public class LogBase<T>
{
public LogBase()
{
CallTime = DateTime.Now.ToString("yyyyMMddHHmmssfff");
SerialNo = Guid.NewGuid().ToString("N");
ClientType = "";
Message = default(T);
var myEntry = Dns.GetHostEntry(Dns.GetHostName());
var address = myEntry.AddressList.FirstOrDefault(e => e.AddressFamily.ToString().Equals("InterNetwork"));
if (address == null) return;
var ip = address.ToString();
HostIp = ip;
} /// <summary>
/// 调用时间,格式:yyyyMMddHH24mmss
/// </summary>
public string CallTime { get; private set; } /// <summary>
/// 消息序列号 UUID
/// </summary>
public string SerialNo { get; private set; } /// <summary>
/// 客户端IP地址
/// </summary>
public string HostIp { get; private set; } /// <summary>
/// 客户端类型:1:pc 2:手机
/// </summary>
public string ClientType { get; private set; } /// <summary>
/// 业务信息
/// </summary>
public T Message { get; set; } }

测试程序用到的自定义日志类:

 public class InsuranceLog
{
/// <summary>
/// 当前登录用户
/// </summary>
public string UserName { get; set; } /// <summary>
/// 业务key
/// </summary>
public string BusinessKey { get; set; } /// <summary>
/// 业务名称 如:查询政策 下订单 查看订单
/// </summary>
public string BusinessName { get; set; } /// <summary>
/// 业务参数
/// </summary>
public string BusinessParameters { get; set; }
}

未完待续

使用MongoDB 记录业务日志的更多相关文章

  1. 使用NLog记录业务日志到数据库

    项目中很多时候要记录业务日志,其实是可以直接用日志框架计入数据库的. 使用NLog并不是只能将日志主体插入数据库,而是可以根据实际情况自定义任意列记入.非常方便.而且很容易实现 下面是用NLog记录业 ...

  2. spring集成mongodb通过aop记录业务日志

    1. 编辑 pom.xml 添加 maven 依赖 <!-- mongodb --> <dependency> <groupId>org.mongodb</g ...

  3. aop 例外通知就是记录业务方法出现错误 并保存到日志里面的功能

    aop 例外通知就是记录业务方法出现错误 并保存到日志里面的功能

  4. 十:SpringBoot-配置AOP切面编程,解决日志记录业务

    SpringBoot-配置AOP切面编程,解决日志记录业务 1.AOP切面编程 1.1 AOP编程特点 1.2 AOP中术语和图解 2.SpringBoot整合AOP 2.1 核心依赖 2.2 编写日 ...

  5. ASP.NET记录错误日志的方式

    程序记录错误日志是一种看起来对一般用户没什么作用,但对程序开发者用处很大的东西,它能查出错误或异常的程序马迹.那么,常用的记录错误日志的方式有哪些呢? 大多数情况下使用的是 1.直接记录为txt/xm ...

  6. Appfuse:记录操作日志

    appfuse的数据维护操作都发生在***form页面,与之对应的是***FormController,在Controller中处理数据的操作是onSubmit方法,既然所有的操作都通过onSubmi ...

  7. MongoDB实战指南(四):MongoDB的Journaling日志功能

    mongoDB的Journaling日志功能与常见的log日志是不一样的,mongoDB也有log日志,它只是简单记录了数据库在服务器上的启动信息.慢查询记录.数据库异常信息.客户端与数据库服务器连接 ...

  8. 采用Spring AOP+Log4j记录项目日志

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6567672.html 项目日志记录是项目开发.运营必不可少的内容,有了它可以对系统有整体的把控,出现任何问题 ...

  9. Spring AOP+Log4j记录项目日志

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6567672.html 项目日志记录是项目开发.运营必不可少的内容,有了它可以对系统有整体的把控,出现任何问题 ...

随机推荐

  1. Java多线程中的异常处理

    在java多线程程序中,所有线程都不允许抛出未捕获的checked exception,也就是说各个线程需要自己把自己的checked exception处理掉.这一点是通过java.lang.Run ...

  2. Unique Word Abbreviation -- LeetCode

    An abbreviation of a word follows the form <first letter><number><last letter>. Be ...

  3. 数据挖掘算法之k-means算法

    系列文章:数据挖掘算法之决策树算法       k-means算法可以说是数据挖掘中十大经典算法之一了,属于无监督的学习.该算法由此衍生出了很多类k-means算法,比如k中心点等等,在数据挖掘领域, ...

  4. NOI2016 高中OI生涯的最后一站

    你乘坐的航班XXX已经抵达终点站——四川绵阳. “呼——”机舱外的天空灰沉沉的,不禁有些压抑与紧张. 一出机场,就看见南山中学的牌子,黄色衣服的志愿者们,还有热情的老师们. 感觉刚才的情绪又一扫而空了 ...

  5. 【分享】· 图床&在线分享演示文稿

    关于图床 什么是图床? 这并不是一个多么高大上的名词概念!用比较通俗的话来说,当你在撰写新文章时,你需要去插入图片以使得你的文章内容更加直观.易懂,这个时候有以下几种办法: 在博客根目录的 sourc ...

  6. linux-查找命令-find

    1. 按文件名(目录)查找.(*代表模糊匹配) find / -name curl    在根目录查找名字是curl的文件名(目录) find / -name "*curl*"   ...

  7. Android访问WCF服务(使用json实现参数传递)

    经过多日努力, 终于勉强弄明白了Android访问WCF服务的方法. 服务端实现 一, 实现服务. 操作契约 [ServiceContract] public interface IService { ...

  8. sql 分组后按时间降序排列再取出每组的第一条记录

    原文:sql 分组后按时间降序排列再取出每组的第一条记录 竞价记录表: Aid 为竞拍车辆ID,uid为参与竞价人员ID,BidTime为参与竞拍时间 查询出表中某人参与的所有车辆的最新的一条的竞价记 ...

  9. JAVA常见算法题(一)

    package com.xiaowu.demo; // 有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第四个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少? /** * ...

  10. etcd:从应用场景到实现原理的全方位解读

    随着CoreOS和Kubernetes等项目在开源社区日益火热,它们项目中都用到的etcd组件作为一个高可用强一致性的服务发现存储仓库,渐 渐为开发人员所关注.在云计算时代,如何让服务快速透明地接入到 ...