首页 > 其他 > 详细

muduo源码分析之logger日志

时间:2021-05-13 13:30:10      阅读:13      评论:0      收藏:0      [点我收藏+]

相关文件

muduo/base/Logging.h --Logger类的声明和LOG_INFO等宏定义
muduo/base/Logging.cc --Logger构造、析构等方法的实现
muduo/base/LogStream.h --FixedBuffer类和LogStream类
muduo/base/LogStream.cc --LogStream重载<<运算符

作用

  • 开发时调试程序
  • 运行时诊断系统故障、记录系统运行状态

使用

在muduo中日志分了以下这几种级别,默认级别为INFO,TRACE和DEBUG的日志不输出。

日志级别 表示
TRACE 指出比DEBUG粒度更细的信息事件
DEBUG 指出细粒度事件,用于开发调试
INFO 表明消息在粗粒度级别上突出强调应用程序的运行过程
WARN 系统能正常运行,但可能会出现潜在错误
ERROR 虽然发生错误事件,但不影响系统的继续运行
FATAL 指出每个严重的错误事件将会导致应用程序的退出

明白了muduo的日志级别就可以使用日志了,使用muduo的日志十分简单

#include <muduo/base/Logging.h>
#include <errno.h>

using namespace muduo;

int main()
{
	LOG_TRACE<<"trace ...";
	LOG_DEBUG<<"debug ...";
	LOG_INFO<<"info ...";
	LOG_WARN<<"warn ...";
	LOG_ERROR<<"error ...";
	//LOG_FATAL<<"fatal ...";
	errno = 13;
	LOG_SYSERR<<"syserr ...";
	LOG_SYSFATAL<<"sysfatal ...";
	return 0;
}

默认是输出到stdout,当然也可以输出到自定义文件

#include <muduo/base/Logging.h>
#include <errno.h>
#include <stdio.h>

using namespace muduo;

FILE* g_file;

void dummyOutput(const char* msg, int len)
{
	if (g_file)
	{
		fwrite(msg, 1, len, g_file);
	}
}

void dummyFlush()
{
	fflush(g_file);
}

int main()
{
	g_file = ::fopen("/tmp/muduo_log", "ae");
	Logger::setOutput(dummyOutput);
	Logger::setFlush(dummyFlush);

	LOG_TRACE<<"trace ...";
	LOG_DEBUG<<"debug ...";
	LOG_INFO<<"info ...";
	LOG_WARN<<"warn ...";
	LOG_ERROR<<"error ...";
	//LOG_FATAL<<"fatal ...";
	errno = 13;
	LOG_SYSERR<<"syserr ...";
	//LOG_SYSFATAL<<"sysfatal ...";

	::fclose(g_file);

	return 0;
}

logger源码分析

所以调用 LOG_INFO<<" " 时发生了什么呢?
简单的说:LOG_INFO是宏定义,生成Logger类的临时对象,调用stream()方法返回其中的流对象stream,流对象stream重载了<<运算符,先将日志保存到其中的缓冲区FixedBuffer,当Logger临时对象销毁时,在析构函数中将缓冲区的输出到stdout或设置的文件。

下面按照这个流程看一下主要代码

muduo源码分析之logger日志

原文:https://www.cnblogs.com/Lj-ming/p/14763650.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!