重写Sylar服务器框架:日志模块

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方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值