Sylar服务器框架:日志模块
模块概述
日志模块用于输出程序日志,方便从日志中定位程序过程中的运行问题。
模块功能
- 可定义不同的日志输出地:
- StdoutLogAppender(输出到控制台)
- FileLogAppender(输出到文件)
- 可定义不同的日志级别:
- UNKNOW(未知级别)
- DEBUG(DEBUG级别)
- INFO(INFO级别)
- WARN(WARN级别)
- ERROR(ERROR级别)
- FATAL(FATAL级别)
- 可定义不同的日志格式:
- m 消息
- p 日志级别
- r 累计毫秒数
- c 日志名称
- t 线程id
- n 换行
- d 时间
- f 文件名
- l 行号
- T tab
- F 协程id
- N 线程名称
- 可通过配置YAML文件来配置日志输出格式
简单例子
// 日志默认格式是"%d%T%t%T%N%T%F%T[%p]%T[%c]%T%f:%l%T%m%n"
sylar::Logger::ptr logger(new sylar::Logger);
// 未定义格式和日志级别,输出到控制台
logger->addAppender(sylar::LogAppender::ptr(new sylar::StdoutLogAppender));
// 定义格式和日志级别,输出到日志文件
sylar::FileLogAppender::ptr file_appender(new sylar::FileLogAppender("./log.txt"));
sylar::LogFormatter::ptr fmt(new sylar::LogFormatter("%d%T%p%T%m%T%n"));
file_appender->setFormatter(fmt);
file_appender->setLevel(sylar::LogLevel::ERROR);
logger->addAppender(file_appender);
// 使用日志主输出器
sylar::Logger::ptr g_logger = SYLAR_LOG_ROOT();
// 使用自定义名称日志输出器
sylar::Logger::ptr g_logger = SYLAR_LOG_NAME("system");
// 使用流式写入logger
SYLAR_LOG_INFO(g_logger) << "test INFO";
SYLAR_LOG_WARN(g_logger) << "test WARN";
SYLAR_LOG_DEBUG(g_logger) << "test DEBUG";
SYLAR_LOG_ERROR(g_logger) << "test ERROR";
SYLAR_LOG_FATAL(g_logger) << "test FATAL";
// 使用格式化方式写入logger
SYLAR_LOG_FMT_INFO(logger,"test %s INFO","fmt");
SYLAR_LOG_FMT_WARN(logger,"test %s WARN","fmt");
SYLAR_LOG_FMT_DEBUG(logger,"test %s DEBUG","fmt");
SYLAR_LOG_FMT_ERROR(logger,"test %s ERROR","fmt");
SYLAR_LOG_FMT_FATAL(logger,"test %s FATAL","fmt");
模块分析
调用过程分析
类分析
LogEvent(std::shared_ptr<Logger> logger, LogLevel::Level level, const char *file, int32_t line, uint32_t elapse, uint32_t threadid, uint32_t fiber_id, uint64 time, const std::string &thread_name);
LogEvent类是日志事件类,用于保存事件的各项信息,通过构造函数初始化,通过format函数进行格式化写入日志内容。LogEventWrap类是日志事件包装器,便于使用LogEvent类。创建一个LogEventWrap类,包含LogEvent里的内容,通过getSS函数写入LogEvent里日志内容字符串流,结束时,在LogEventWrap的析构函数里,调用logger->Log函数打印日志到输出地。
Logger类是日志输出器类,通过log函数按照m_appenders里的日志输出地按照m_formatter格式进行输出,如果m_appenders为空,则调用m_root->log(…)。LoggerManager类是管理Logger类,LoggerManager类使用的是单例模式。
LogFormatter类是日志格式器。可通过构造函数传入格式化的格式,通过init函数解析放入m_items里,通过调用format哈数返回格式化日志文本。
virtual void format(std::shared_ptr<Logger> logger, std::ostream &os,LogLevel::Level level, LogEvent::ptr event) = 0;
在日志模块中,FormatItem使用了简单工厂模式,FormatItem类是抽象产品类,MessageFormatItem、LevelFormatItem等类是具体产品类,实现基类的format方法。
virtual void Log(std::shared_ptr<Logger> logger, LogLevel::Level level, LogEvent::ptr event) = 0;
virtual std::string toYamlString() = 0;
LogAppender是日志输出器,用于将一个日志事件输出到对应的输出地。该类包含一个LogFormatter成员和Log方法,日志事件经过LogFormatter格式化后再调用Log方法输出到对应的日志输出地。在日志模块中,LogAppender使用了简单工厂模式,LogAppender类是抽象产品类,StdoutLogAppender和FileLogAppender是具体产品类,实现基类的Log方法。
法输出到对应的日志输出地。在日志模块中,LogAppender使用了简单工厂模式,LogAppender类是抽象产品类,StdoutLogAppender和FileLogAppender是具体产品类,实现基类的Log方法。