日志系统的问答
日志系统记录的内容及作用?
在开发其他模块时写入一些关键信息,后续可以通过日志判断模块功能是否正常,对不明情况进行分析。在运行期间主要记录新客户的建立与断开、异常事件的发生(并发数量达到上限、套接字初始化失败)。
说下你的日志系统的运行机制?
1、单例获取实例
2、init初始化实例,新建日志,日志会进行分级/分文件判断,判断是同步还是异步,同步直接写入日志,异步先写入阻塞队列,写线程取出写入日志。
3、其他模块调用write_log函数写日志。
为什么要异步?和同步的区别是什么?
同步日志写入函数与工作线程串行执行,由于涉及I/O操作,单条日志过大的时候,同步模式会阻塞处理流程,使得服务器并发能力下降。
异步日志采用生产者、消费者模型,工作线程先将所写日志存入缓冲区,写线程从缓冲区取出内容,写入日志,并发能力更高一些。
区别:
同步:优点:写入简单 缺点:写入会阻塞工作线程,高并发情况下,写入大文件等,效率低
异步:优点:不阻塞当前线程,将写入交给其他线程处理 缺点:可能出现数据丢失、日志顺序混乱等情况
异步写入的缺点有?
1、写入操作顺序不确定:可能不是按程序中的顺序进行
2、缓冲区满:缓冲区满时,新写入的操作会被丢弃或者阻塞,可能会出现数据丢失问题
3、程序异常退出:同步写入更快,异步可能会导致程序异常退出时还有数据未写入到日志文件中,导致数据丢失,无法回到退出前一个状态。
使用同步日志更好的情况有?
1、简单,不需考虑线程同步,缓冲区管理
2、数据可靠性:保证及时写入,未写入就会阻塞
3、日志顺序:同步可以保证写入顺序,对于需要按照时间事件顺序记录日志的应用程序来说是非常重要的。
考虑过日志丢弃的情况吗?
1、定期清理过期历史日志文件,防止占用过多磁盘。
2、基于日志级别的优先级,把级别较低的日志忽略,如重复无效日志,重要的如异常、连接信息不丢弃
可以进一步对日志进行采样分析,再按优先级等规则来优化要丢弃哪些日志。
3、日志数量过多时,可以考虑删除
日志系统的实现需要考虑什么?
线程安全性、效率问题
1、线程安全性
日志系统需记录多个连接运行情况,也就是说日志系统被多个线程拥有,考虑到线程安全问题,需要对操作加锁,避免出错。
2、效率问题
实现了人为加锁,而日志需IO操作,线程间会产生竞争、阻塞。使用异步处理提高效率,后续可以考虑优化为双缓冲区。
日志系统的缓冲区满了(内存不足)怎么办?
1、缓冲区动态扩容【复写已经写入内核缓冲区、STL底层扩容机制】
2、主动丢弃数据
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~