Skip to content

Tantanovo/MYDistributed-Log-Project

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 

Repository files navigation

📁 文件功能一览表

  1. 底层基础 timestamp.hpp/cpp - 时间工具

获取当前时间、格式化时间字符串

用于给每条日志打时间戳

appendfile.hpp/cpp - 文件写入器

最底层的文件操作

使用缓冲区批量写文件

性能关键:fwrite_unlocked

  1. 日志消息构建 logcommon.hpp/cpp - 常量定义

日志级别枚举:TRACE、DEBUG、INFO...

缓冲区大小常量

logmessage.hpp/cpp - 单条日志消息

包含:时间、级别、文件名、行号、内容

支持 << 流式操作符:LOG_INFO << "msg"

  1. 文件管理 logfile.hpp/cpp - 日志文件管理器

控制日志文件滚动(按大小/按时间)

决定何时创建新文件

调用 appendfile 实际写文件

  1. 异步核心 countdownlatch.hpp/cpp - 线程同步工具

简单的"倒计时门闩"

让主线程等子线程启动完成

asynlogging.hpp/cpp - 异步日志引擎 ⭐️ 最复杂

前端:接收日志消息 → 存入当前缓冲区

后端:定时将缓冲区写入文件

生产者-消费者模式

  1. 用户接口 logger.hpp/cpp - 用户使用的接口

提供宏:LOG_INFO、LOG_ERROR

设置全局日志级别

调用 asynlogging 或直接输出

🔗 核心数据流(一句话逻辑) text 用户代码 ↓ LOG_INFO << "hello" logger (接口层) → 调用输出函数 ↓ asynlogging (异步层) → 前端:收消息 → 后端:写文件 ↓ logfile (文件管理层) → 检查是否要滚动文件 ↓ appendfile (文件写入层) → 实际写入磁盘 🎯 五个核心概念

  1. 双缓冲区(asynlogging的核心) text 前端线程写 → [当前缓冲区 currentbuffer_] 后端线程读 → [待写队列 buffers_] → 批量写入文件
  2. 文件滚动(logfile的核心) 按大小:文件超过128KB → 新文件

按时间:每天零点 → 新文件

文件名:app.20240101-120000.hostname.pid.log

  1. 流式接口(logger的核心) cpp LOG_INFO << "user" << user_id << "login"; // 等价于: // 构建字符串"user 123 login" // 交给asynlogging处理
  2. 异步处理(关键优化) 前端:只写内存缓冲区,不阻塞

后端:定时批量写磁盘,减少IO次数

  1. 线程安全 logger:单线程写缓冲区

asynlogging:mutex保护缓冲区交换

logfile:可选是否加锁

🔄 启动流程 用户调用 asynlogging.start()

启动后台线程(消费者)

用户调用 LOG_INFO

消息存入当前缓冲区

后台线程定时取出缓冲区写入文件

🛑 停止流程 设置 running_ = false

唤醒后台线程

写入剩余日志

关闭文件

💡 一句话总结每个文件 text timestamp : 获取和格式化时间 appendfile : 高效写文件 logfile : 管理文件滚动 asynlogging : 异步处理日志(核心引擎) logger : 用户使用的接口(LOG_XXX宏) logmessage : 构建单条日志 //logcommon : 定义常量和枚举 countdownlatch: 线程启动同步

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors