日志系统的问答

 

日志系统记录的内容及作用?

在开发其他模块时写入一些关键信息,后续可以通过日志判断模块功能是否正常,对不明情况进行分析。在运行期间主要记录新客户的建立与断开、异常事件的发生(并发数量达到上限、套接字初始化失败)。

说下你的日志系统的运行机制?

1、单例获取实例

2、init初始化实例,新建日志,日志会进行分级/分文件判断,判断是同步还是异步,同步直接写入日志,异步先写入阻塞队列,写线程取出写入日志。

3、其他模块调用write_log函数写日志。

为什么要异步?和同步的区别是什么?

同步日志写入函数与工作线程串行执行,由于涉及I/O操作,单条日志过大的时候,同步模式会阻塞处理流程,使得服务器并发能力下降。

异步日志采用生产者、消费者模型,工作线程先将所写日志存入缓冲区,写线程从缓冲区取出内容,写入日志,并发能力更高一些。

区别:

同步:优点:写入简单 缺点:写入会阻塞工作线程,高并发情况下,写入大文件等,效率低

异步:优点:不阻塞当前线程,将写入交给其他线程处理 缺点:可能出现数据丢失、日志顺序混乱等情况

异步写入的缺点有?

1、写入操作顺序不确定:可能不是按程序中的顺序进行

2、缓冲区满:缓冲区满时,新写入的操作会被丢弃或者阻塞,可能会出现数据丢失问题

3、程序异常退出:同步写入更快,异步可能会导致程序异常退出时还有数据未写入到日志文件中,导致数据丢失,无法回到退出前一个状态。

使用同步日志更好的情况有?

1、简单,不需考虑线程同步,缓冲区管理

2、数据可靠性:保证及时写入,未写入就会阻塞

3、日志顺序:同步可以保证写入顺序,对于需要按照时间事件顺序记录日志的应用程序来说是非常重要的。

考虑过日志丢弃的情况吗?

1、定期清理过期历史日志文件,防止占用过多磁盘。

2、基于日志级别的优先级,把级别较低的日志忽略,如重复无效日志,重要的如异常、连接信息不丢弃

可以进一步对日志进行采样分析,再按优先级等规则来优化要丢弃哪些日志。

3、日志数量过多时,可以考虑删除

日志系统的实现需要考虑什么?

线程安全性、效率问题

1、线程安全性

日志系统需记录多个连接运行情况,也就是说日志系统被多个线程拥有,考虑到线程安全问题,需要对操作加锁,避免出错。

2、效率问题

实现了人为加锁,而日志需IO操作,线程间会产生竞争、阻塞。使用异步处理提高效率,后续可以考虑优化为双缓冲区。

日志系统的缓冲区满了(内存不足)怎么办?

1、缓冲区动态扩容【复写已经写入内核缓冲区、STL底层扩容机制】

2、主动丢弃数据

posted @   feifei102  阅读(65)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示