Log 是每个项目必须的,他是跟踪问题的最直接的依据。Ceph 也设计自己的log机制。

初始化启动log实例,启动log线程。

_log = new ceph::log::Log(&_conf->subsys);

_log->start();

日志的工作函数:

比较简单,交换队列到临时队列t 中,释放条件变量,开始进入_flush的写操作。

void Log::flush()

{

pthread_mutex_lock(&m_flush_mutex);

m_flush_mutex_holder = pthread_self();

pthread_mutex_lock(&m_queue_mutex);

m_queue_mutex_holder = pthread_self();

EntryQueue t;

t.swap(m_new);

pthread_cond_broadcast(&m_cond_loggers);

m_queue_mutex_holder = 0;

pthread_mutex_unlock(&m_queue_mutex);

_flush(&t, &m_recent, false);

// trim

while (m_recent.m_len > m_max_recent) {

delete m_recent.dequeue();

}

m_flush_mutex_holder = 0;

pthread_mutex_unlock(&m_flush_mutex);

}

_flush函数中主要根据subsys 和 其level决定是否写日志,m_subs是负责管理subsys的一个map表。

这个表是如何生成的呢。

注意参数:crash 当dump_recent的才会被调用。

void Log::_flush(EntryQueue *t, EntryQueue *requeue, bool crash)

{

Entry *e;

while ((e = t->dequeue()) != NULL) {

unsigned sub = e->m_subsys;

bool should_log = crash || m_subs->get_log_level(sub) >= e->m_prio;

bool do_fd = m_fd >= 0 && should_log;

bool do_syslog = m_syslog_crash >= e->m_prio && should_log;

bool do_stderr = m_stderr_crash >= e->m_prio && should_log;

bool do_graylog2 = m_graylog_crash >= e->m_prio && should_log;

e->hint_size();

if (do_fd || do_syslog || do_stderr) {

size_t buflen = 0;

char *buf;

size_t buf_size = 80 + e->size();

bool need_dynamic = buf_size >= 0x10000; //avoids >64K buffers

//allocation at stack

char buf0[need_dynamic ? 1 : buf_size];

if (need_dynamic) {

buf = new char[buf_size];

} else {

buf = buf0;

}

if (crash)

buflen += snprintf(buf, buf_size, "%6d> ", -t->m_len);

buflen += e->m_stamp.sprintf(buf + buflen, buf_size-buflen);

buflen += snprintf(buf + buflen, buf_size-buflen, " %lx %2d ",

(unsigned long)e->m_thread, e->m_prio);

buflen += e->snprintf(buf + buflen, buf_size - buflen - 1);

if (buflen > buf_size - 1) { //paranoid check, buf was declared

//to hold everything

buflen = buf_size - 1;

buf[buflen] = 0;

}

if (do_syslog) {

syslog(LOG_USER|LOG_INFO, "%s", buf);

}

if (do_stderr) {

cerr << buf << std::endl;

}

if (do_fd) {

buf[buflen] = '\n';

int r = safe_write(m_fd, buf, buflen+1);

if (r != m_fd_last_error) {

if (r < 0)

cerr << "problem writing to " << m_log_file

<< ": " << cpp_strerror(r)

<< std::endl;

m_fd_last_error = r;

}

}

if (need_dynamic)

delete[] buf;

}

if (do_graylog2 && m_graylog) {

m_graylog->log_entry(e);

}

requeue->enqueue(e);

}

}

SubsystemMap

负责管理所有的subsys。

_log = new ceph::log::Log(&_conf->subsys);

通过参数将其传入到Log.cc中。

_conf->subsys的初始化工作,如何做的呢?

首先定义了3个宏

定义宏SUBSYS(name, log, gather) 是执行subsys.add(ceph_subsys_##name, STRINGIFY(name), log, gather);

定义宏DEFAULT_SUBSYS(log, gather) 是执行subsys.add(ceph_subsys_, "none", log, gather);

定义宏#define OPTION(a, b, c) 为空

将config_opts.h展开,依次执行subsys.add即可完成,

void md_config_t::init_subsys()

{

#define SUBSYS(name, log, gather)

subsys.add(ceph_subsys_##name, STRINGIFY(name), log, gather);

#define DEFAULT_SUBSYS(log, gather)

subsys.add(ceph_subsys_, "none", log, gather);

#define OPTION(a, b, c)

#include "common/config_opts.h"

#undef OPTION

#undef SUBSYS

#undef DEFAULT_SUBSYS

}

ceph_subsys_##name 的值从哪儿来的呢?同样使用了宏的机制。和上一个宏一样,展开后在enum变量中。

enum config_subsys_id {

ceph_subsys_,   // default

#define OPTION(a,b,c)

#define SUBSYS(name, log, gather) \

ceph_subsys_##name,

#define DEFAULT_SUBSYS(log, gather)

#include "common/config_opts.h"

#undef SUBSYS

#undef OPTION

#undef DEFAULT_SUBSYS

ceph_subsys_max

};

如何调用ldout 写日志呢?

#define ldout(cct, v)  dout_impl(cct, dout_subsys, v) dout_prefix

Dout_impl 生成了log_entry 写入到日志文件, dout_prefix 标准输出

ceph log机制的更多相关文章

  1. Oracle Redo Log 机制 小结(转载)

    Oracle 的Redo 机制DB的一个重要机制,理解这个机制对DBA来说也是非常重要,之前的Blog里也林林散散的写了一些,前些日子看老白日记里也有说明,所以结合老白日记里的内容,对oracle 的 ...

  2. 解读Android LOG机制的实现【转】

    转自:http://www.cnblogs.com/hoys/archive/2011/09/30/2196199.html http://armboard.taobao.com/ Android提供 ...

  3. android log机制——输出log【转】

    转自:http://blog.csdn.net/tdstds/article/details/19084327 目录(?)[-] 在android Java code中输出log Logprintln ...

  4. Android中Log机制详解

    Android中Log的输出有如下几种: Log.v(String tag, String msg);        //VERBOSELog.d(String tag, String msg);   ...

  5. js的线程和同步异步以及console.log机制

    项目上线了,闲下来就写写东西吧.积累了好多东西都没有做笔记~挑几个印象深刻的记录一下吧. js的同步异步以及单线程问题: 都知道单线程是js的一大特性.但是通常io(ajax获取服务器数据).用户/浏 ...

  6. Unity3D Log 收集机制

    最近做项目的时候发现,需要有一个完整的log机制.这样不仅方便调试而且方便观察. 一.需求 目前我认为一个完善的log机制应该是这样的. 一.双击定位 二.生命周期是全局的 三.输出包括consloe ...

  7. android log写入机制

    这几天和华为的leader面试了下.感觉不错.关键是小女.不容易.是技术面啊.我说的不容易不是面试不容易,是说在华为写代码的小女不容易.哥走南闯北这么多年,女人代码写的好真不多. 其实在任何时候,只要 ...

  8. Ceph纠删码编码机制

    1 Ceph简述 Ceph是一种性能优越,可靠性和可扩展性良好的统一的分布式云存储系统,提供对象存储.块存储.文件存储三种存储服务.Ceph文件系统中不区分节点中心,在理论上可以实现系统规模的无限扩展 ...

  9. 理解 OpenStack + Ceph (7): Ceph 的基本操作和常见故障排除方法

    本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...

随机推荐

  1. Python连载20-偏函数&zip函数&enumerate函数

    一. 偏函数 二. #先举个例子 #把字符串转换为十进制数字 int(') #help(int),int函数中有一个参数base代表把它转换某个进制的数字 #把八进制的字符串转换为十进制 eight ...

  2. Codeforces Gym100502A:Amanda Lounges(DFS染色)

    http://codeforces.com/gym/100502/attachments 题意:有n个地点,m条边,每条边有一个边权,0代表两个顶点都染成白色,2代表两个顶点都染成黑色,1代表两个顶点 ...

  3. 详解FIX协议的原理、消息格式及配置开发

    一.定义 FIX协议是由国际FIX协会组织提供的一个开放式协议,目的是推动国际贸易电子化的进程,在各类参与者之间,包括投资经理.经纪人,买方.卖方建立起实时的电子化通讯协议.FIX协议的目标是把各类证 ...

  4. java判断年份是否为闰年

    在t1.jsp 中,设置一个表单,可以输入年份,提交到另外一个action进行计算,如果算出来是闰年,那么就跳转到a1.jsp(显示闰年),如果是平年就跳转到a2.jsp(显示平年). 要求:需要把计 ...

  5. [golang]golang time.After内存泄露问题分析

    无意中看到一篇文章说,当在for循环里使用select + time.After的组合时会产生内存泄露,于是进行了复现和验证,以此记录 内存泄露复现 问题复现测试代码如下所示: package mai ...

  6. 跟我学SpringCloud | 第十四篇:Spring Cloud Gateway高级应用

    SpringCloud系列教程 | 第十四篇:Spring Cloud Gateway高级应用 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 ...

  7. Notepad++提升工作效率小技巧

    前言 简单的提升工具效率需求可以借助Notepad编辑器实现.以前也用Python/Shell开发过本文中提到的需求,现在发现其实没有必要.本文介绍一些工作中常见的可以通过"Notepad+ ...

  8. SpringBoot第二十一篇:整合ActiveMQ

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11190048.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言   前一章节中 ...

  9. Node.js热部署代码,实现修改代码后自动重启服务方便实时调试

    写PHP等脚本语言的时候,已经习惯了修改完代码直接打开浏览器去查看最新的效果.而Node.js 只有在第一次引用时才会去解析脚本文件,以后都会直接访问内存,避免重复载入,这种设计虽然有利于提高性能,却 ...

  10. idea下maven命令打包不同配置

    1. 场景描述 不知道大家有没有遇到过?Idea集成的maven,在切换不同环境配置的时候,有时候反应很慢,还存在切换后打包还是原配置的情况. 2. 问题解决 通过在idea下执行maven命令进行切 ...