【实战项目】同步&异步日志系统

1、项目介绍

本项目主要实现一个日志系统,其主要支持以下功能:

  • 支持多级别日志消息

将日志分为不同等级的日志,有调试级别的日志、提示级别的日志、警告级别的日志、错误级别的日志、致命级别的日志……不同级别的日志应对着不同的场景。可以通过日志级别来实现限制输出的级别:当调试时候可以规定打印调试级别以上的日志信息,方便调试;当发布之后可以设置成输出错误级别以上的日志信息,这样能够使定位更加明确,分析更快速准确。

  • 支持同步日志和异步日志

同步日志就是将日志写入到文件/数据库这个操作由业务线程自己来完成;异步日志就是指业务线程将日志放到内存中,并不由业务线程将日志写入到文件/数据库(避免因为文件/数据库问题使业务线程卡在这里,不能执行下面的业务),而是由其他的工作线程将日志写入到文件/数据库,进行实际的输出。

  • 支持可靠写入日志到控制台、文件以及滚动文件中

支持日志消息的不同落地方向,可以将这条消息进行打印、或写入到指定的文件中、或写入到滚动文件中(滚动文件是指当日志信息写入到一个文件中,当这个文件达到指定的大小(也可以是指定的日期)之后切换到下一个文件写入)。

  • 支持多线程程序并发写日志

是一个线程安全的日志系统,当两个线程同时通过日志器来同时写入到同一个文件中时,交叉写入会引发线程安全的问题。要实现的日志系统会解决上面的问题,系统是线程安全的,就算是多个线程同时写也不会出现数据二义的情况。

  • 支持扩展不同的日志落地目标地

可以将日志写入到数据库、或者云服务器中的日志分析服务器中等,支持自定义落地方向。

2、开发环境

  • CentOS 7
  • vscode/vim
  • g++/gdb
  • Makefile

3、核心技术

  • 类层次设计(继承和多态的应用)
  • C++11(多线程、auto、智能指针、右值引用等)
  • 双缓冲区
  • 生产消费模型
  • 多线程
  • 设计模式(单例、工厂、代理、模板等)

4、环境搭建

本项⽬不依赖其他任何第三⽅库,只需要安装好CentOS/Ubuntu+vscode/vim环境即可开发。

5、日志系统介绍

5.1 为什么需要日志系统

  • ⽣产环境的产品为了保证其稳定性及安全性是不允许开发⼈员附加调试器去排查问题,可以借助⽇志系统来打印⼀些⽇志帮助开发⼈员解决问题
  • 上线客户端的产品出现bug⽆法复现并解决(出现错误并且不能通过少量测试找到bug),可以借助⽇志系统打印⽇志并上传到服务端帮助开发⼈员进⾏分析
  • 对于⼀些⾼频操作在少量调试次数下可能⽆法触发我们想要的⾏为(复现困难),通过断点的暂停⽅式,我们不得不重复操作⼏⼗次、上百次甚⾄更多,导致排查问题效率是⾮常低下,可以借助打印⽇志的⽅式查问题
  • 在分布式、多线程/多进程代码中,出现bug⽐较难以定位,可以借助⽇志系统打印log帮助定位bug
  • 帮助⾸次接触项⽬代码的新开发⼈员理解代码的运⾏流程

5.2 日志系统技术实现

⽇志系统的技术实现主要包括三种类型:
利⽤printf、std::cout等输出函数将⽇志信息打印到控制台(实际项目开发时不允许出现的)
对于⼤型商业化项⽬,为了⽅便排查问题,我们⼀般会将⽇志输出到⽂件或者是数据库系统⽅便查询和分析⽇志,主要分为同步⽇志和异步⽇志⽅式

  • 同步写日志

  • 异步写日志

5.2.1 同步写日志

同步⽇志是指当输出⽇志时,必须等待⽇志输出语句执⾏完毕后,才能执⾏后⾯的业务逻辑语句,⽇志输出语句与程序的业务逻辑语句将在同⼀个线程运⾏。每次调⽤⼀次打印⽇志API就对应⼀次系统调⽤write写⽇志文件。

猜你喜欢

转载自blog.csdn.net/weixin_53943591/article/details/132816863
今日推荐