项目参考:https://github.com/sylar-yin/sylar

文档参考:https://www.midlane.top/wiki/pages/viewpage.action?pageId=10061019

LogAppender, 定义日志的输出落地点,目前实现了控制台日志(StdoutLogAppender),文件日志(FileLogAppender).两种类型。拥有自己的日志级别和日志格式,可以灵活定义不同的输出。主要用于区分日志级别,将error日志,单独输出到一个文件,以防被其他类型的日志淹没

LogFormat,日志格式,通过字符串自定义日志的格式,仿printf格式。可以灵活定义日志格式

类图

logUML

LogFormatter: 日志格式器,与log4cpp的PatternLayout对应,用于格式化一个日志事件。 该类构建时可以指定pattern,表示如何进行格式化。提供format方法,用于将日志事件格式化成字符串。

LogAppender: 日志输出器,用于将一个日志事件输出到对应的输出地。该类内部包含一个LogFormatter成员 和一个log方法,日志事件先经过LogFormatter格式化后再输出到对应的输出地。从这个类可以派生出不同的Appender类型,比如StdoutLogAppender和FileLogAppender,分别表示输出到终端和文件。

Logger: 日志器,负责进行日志输出。一个Logger包含多个LogAppender和一个日志级别,提供log方法, 传入日志事件,判断该日志事件的级别高于日志器本身的级别之后调用LogAppender将日志进行输出, 否则该日志被抛弃。

LogEvent: 日志事件,用于记录日志现场,比如该日志的级别,文件名/行号,日志消息,线程/协程号, 所属日志器名称等。

LogEventWrap: 日志事件包装类,其实就是将日志事件和日志器包装到一起,因为一条日志只会在一个日志器上进行输出。 将日志事件和日志器包装到一起后,方便通过宏定义来简化日志模块的使用。另外,LogEventWrap还负责在构建时指定日志事件和日志器,在析构时调用日志器的log方法将日志事件进行输出。

LogManager: 日志器管理类,单例模式,用于统一管理所有的日志器,提供日志器的创建与获取方法。 LogManager自带一个root Logger,用于为日志模块提供一个初始可用的日志器。

使用

提供两种方式输出日志

1、方法(函数)调用的方式, 这种方式的使用Logger对象不会被LoggerManager管理

// 创建日志器对象,默认的格式,名称为root
sylar::Logger::ptr logger(new sylar::Logger);
// 添加日志输出地(控制台,文件...)
logger->addAppender(sylar::LogAppender::ptr(new sylar::StdoutLogAppender));
// 日志事件
sylar::LogEvent::ptr event(new sylar::LogEvent(logger,
                                               sylar::LogLevel::INFO,
                                               __FILE__, __LINE__,
                                               0, sylar::GetThreadId(),
                                               sylar::GetFiberId(), time(0), "thread_name"));
// 日志内容
event->getSS() << "Hello";
// 输出日志
logger->log(sylar::LogLevel::DEBUG, event);

2、使用宏的方式(推荐)

// 创建root日志器
sylar::Logger::ptr g_logger = SYLAR_LOG_ROOT();
// 创建自定名称日志器
// sylar::Logger::ptr g_logger = SYLAR_LOG_NAME("system");
// 日志输出
SYLAR_LOG_INFO(g_logger) << "hello" ;