本项目主要实现一个日志系统,主要支持以下功能
包含./logs/Xulog.h
即可
root
d{y-m-d|H:M:S}][t][c][f:l][p]Tmn
DEBUG
接口 | 功能 | 选项 | 返回值类型 |
---|---|---|---|
Xulog::GlobalLoggerBuild() | 构建全局日志器建造器 | - | Xulog::LoggerBuilder |
Xulog::LocalLoggerBuild() | 构建局部日志器建造器 | - | Xulog::LoggerBuilder |
接口 | 功能 | 选项 | 说明 |
---|---|---|---|
buildLoggerName() | 设定日志器名称 | 传入string即可 | 名称不能为空,不可缺省 |
buildFormatter() | 设定日志器格式 | 见日志器格式表 | 默认日志器格式为 d{y-m-d\|H:M:S}][t][c][f:l][p]Tmn ,可缺省 |
buildLoggerLevel() | 设定日志器等级 | Xulog::LogLevel::value::DEBUG Xulog::LogLevel::value::INFO Xulog::LogLevel::value::WARN Xulog::LogLevel::value::ERROR Xulog::LogLevel::value::FATAL | 只有大于等于该等级的日志被输出DEBUG < INFO < WARN < ERROR < FATAL ,另外有OFF 选项,表示关闭日志输出默认为DEBUG,可缺省 |
buildLoggerType() | 设定日志器类型 | Xulog::LoggerType::LOGGER_SYNC Xulog::LoggerType::LOGGER_ASYNC | LOGGER_SYNC 表示同步日志器LOGGER_ASYNC 表示异步日志器,关于同步日志器和异步日志器见后面的介绍默认为同步日志器,可缺省 |
buildSink<>() | 设置落地方法 | <Xulog::StdoutSink>(Xulog::StdoutSink::Color::Enable) <Xulog::FileSink>("file_path") <Xulog::RollSinkBySize>("file_path-", file_size) | 标准落地为控制台输出,传入Xulog::StdoutSink::Color::Enable 则可以开启日志等级颜色,Uneable 则为关闭,不建议开启,输出效率降低非常多文件落地为输出到指定路径的文件中 以文件大小滚动落地,自带文件标号 可扩展至远程日志服务器和数据库,在extend中扩展了以时间滚动落地 默认为控制台输出 关闭颜色显示 |
build() | 构建日志器 | - | 返回值类型为Logger::ptr 日志器指针 |
若不需要更改,可以使用默认设置,不用进行单独调用
接口 | 功能 |
---|---|
Xulog::getLogger(name) | 获取指定名称的日志器,返回值为日志器指针,返回值类型为Logger::ptr |
Xulog::rootLogger() | 获取默认日志器,返回值为默认日志器指针,返回值类型为Logger::ptr |
接口 | 说明 |
---|---|
DEBUG("%s", "测试开始") | 大写为默认全局日志器输出,此处的格式与C/C++格式化输出相同,与等级相同DEBUG\|INFO\|WARN\|ERROR\|FATAL |
debug(logger,"%s", "测试") | 小写为指定日志器输出,需要传入日志器指针,debug\|info\|warn\|error\|fatal |
日志器格式表
占位符 | 说明 |
---|---|
d | 日期,子格式{y-m-d\|H:M:S} 年-月-日|时-分-秒,子格式需要使用大括号 |
T | Tab缩进 |
t | 线程ID |
p | 日志级别 DEBUG < INFO < WARN < ERROR < FATAL 另外有 OFF 选项 |
c | 日志器名称 |
f | 文件名 |
l | 行号 |
m | 日志消息 |
n | 换行 |
服务端启动时需要指定配置文件路径 默认配置文件在config
文件夹中的config.ini
文件里
注意
在生产环境中,有时候是不允许我们程序员利用调试器排查问题,不允许服务暂停
在高频操作中,少量调试次数并不一定能够复现出对应的bug,可能需要重复操作非常多次的情况,导致效率低下
在分布式、多线程代码中,bug更难以定位
因此就需要日志系统进行开发问题的排查
日志系统的技术实现主要分为两大类
这里分为同步和异步写日志
同步日志是指当输出日志时,程序必须等待日志输出语句执行完毕后才能执行后面的逻辑语句,日志输出语句和业务逻辑处于同一个线程
同步日志系统在高并发场景下容易出现系统瓶颈,主要是由于write系统调用和频繁IO导致的
异步日志指的是在输出日志时,输出日志的语句和业务逻辑语句处于不同的线程,使用单独的线程去完成
业务逻辑语句是生产者,而日志线程是消费者,这是一共典型的生产者消费者模型
异步的好处就是日志没有完成输出也不会影响业务逻辑的运行,可以提高程序的效率
[d{y-md\|H:M:S}]T[t]T[p]T[c]Tf:lTmn
[2024-9-20\|12:01:54] [(TID)] [FATAL] [root] main.cc:13 套接字创建失败\n
异步日志器的思想是为了避免业务线程因为写日志的过程时间较长而长时间阻塞
异步日志器的工作就是把业务输出的日志内容放入内存缓冲区中,使用专门的线程进行日志写入
这个模块的主要内容是
双缓冲区的好处是,降低了生产者和消费者之间的冲突,只有在交换的适合需要冲突一次
主要测试内容:单线程 | 多线程 & 同步 | 异步