chromium中的logging日志系统

chromium中logging日志系统初始化:

void InitLogging(const base::CommandLine& command_line) {
  base::FilePath log_filename =
      command_line.GetSwitchValuePath(switches::kLogFile);
  if (log_filename.empty()) {
#if defined(OS_FUCHSIA)
    base::PathService::Get(base::DIR_TEMP, &log_filename);
#else
    base::PathService::Get(base::DIR_EXE, &log_filename);
#endif
    log_filename = log_filename.AppendASCII("content_shell.log");
  }

  logging::LoggingSettings settings;
  settings.logging_dest = logging::LOG_TO_ALL;//日志保存到文件和系统调式日志
  settings.log_file_path = log_filename.value().c_str();//指定日志文件content_shell.log
  settings.delete_old = logging::DELETE_OLD_LOG_FILE;//删除旧日志
  logging::InitLogging(settings);
  logging::SetLogItems(true /* Process ID */, true /* Thread ID */,
                       true /* Timestamp */, false /* Tick count */);//日志保存项: 进程ID、线程ID、时间戳、tick数
}

日志使用:

1)LOG宏:
LOG就像c++标准库的输出一样重载<<,它有几个常用的等级,
像”VERBOSE“,“INFO”, “WARNING”, “ERROR”, “FATAL”,”NUM_SEVERITIES“等
比如”FATAL”LOG会触发一个断点,并打印出栈回溯信息。

#include "base/logging.h"
LOG(INFO) << "enter " << __FILE__<< " , "<<__FUNCTION__ <<"," << __LINE__;
LOG(INFO) << "info等级    = " << logging::LOG_INFO;
LOG(WARNING) << "WARNING等级 = " << logging::LOG_WARNING;
LOG(ERROR) << "ERROR等级   = " << logging::LOG_ERROR;
LOG(FATAL) << "FATAL等级   = " << logging::LOG_FATAL;

2)LOG_IF宏:

使用LOG_IF宏可以在表达式条件为真的情况下才输出log:

int if_int = 5;
LOG_IF(INFO, if_int < 10 ) << "if_int < 10";

3)CHECK宏:

CHECK宏在表达式为假的情况下执行LOG(FATAL)的效果,

如果没有附加调试器,还会生成一个crash dump。

//CHECK宏,条件失败则产生一个LOG(FATAL)
CHECK(0);

4)DLOG宏:

DLOG跟LOG类似,不同的是DLOG只在DEBUG模式下才生效,

在非DEBUG模式下,这部分代码都不会被编译进程序。

DLOG(INFO) << "DLOG onlg debug";
DLOG_IF(INFO, if_int < 10) << "DLOG_IF onlg debug";
LOG_ASSERT(0);
DLOG_ASSERT(0);

5)VLOG宏:
这是一种可以通过命令行参数动态调整输出log策略的宏,这些宏都是INFO级别的。

VLOG(1) << "I'm printed when you run the program with --v=1 or more";
VLOG(2) << "I'm printed when you run the program with --v=2 or more";

如果不好用命令行传递参数,可以直接在代码中添加如下:

base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
  // Don't bother initializing |g_vlog_info| unless we use one of the
  // vlog switches.

 +++ command_line->AppendSwitchASCII(switches::kV,"1");
 +++ command_line->AppendSwitchASCII(switches::kVModule,"profile=2,icon_loader=1,browser_*=3,*/chromeos/*=4 --v=0");

  if (command_line->HasSwitch(switches::kV) ||
      command_line->HasSwitch(switches::kVModule)) {
    // NOTE: If |g_vlog_info| has already been initialized, it might be in use
    // by another thread. Don't delete the old VLogInfo, just create a second
    // one. We keep track of both to avoid memory leak warnings.
    CHECK(!g_vlog_info_prev);
    g_vlog_info_prev = g_vlog_info;

    g_vlog_info =
        new VlogInfo(command_line->GetSwitchValueASCII(switches::kV),
                     command_line->GetSwitchValueASCII(switches::kVModule),
                     &g_min_log_level);
  }

6)trace_event调用跟踪添加log输出:
trace_event原来是chromium用于统计函数体执行时间的方法,稍加改造就可以用于输出特定模块的log。

TRACE_EVENT0("audio", "AudioInputDevice::Start");//例如需要打开audio模块的log
//TRACE_EVENT0宏定义
#define TRACE_EVENT0(category_group, name)    \
  INTERNAL_TRACE_EVENT_ADD_SCOPED(category_group, name)
//INTERNAL_TRACE_EVENT_ADD_SCOPED宏定义
#define INTERNAL_TRACE_EVENT_ADD_SCOPED(category_group, name, ...)           \
  base::trace_event::BuiltinCategories::TRACE_EVENT0_LOG(category_group,name);\//此处是为了添加log新增的代码
  INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category_group);                    \

TRACE_EVENT0_LOG的实现如下:

const char* kCategoriesForTbrw3Testing[]= {
      "audio"};//可以增加需要打开log的种类

void BuiltinCategories::TRACE_EVENT0_LOG(const char* category, const char* name) {
  if (IsStringInArray(category, kCategoriesForTbrw3Testing,
                           base::size(kCategoriesForTbrw3Testing)))
    LOG(INFO) << "suzg---: " << "enter " << category<< " , "<<name;
}

7)web_rtc模块的RTC_LOG:
src\third_party\webrtc_overrides\rtc_base\logging.cc
把log_to_chrome_改为true,即可使用base/logging.cc的logging::LogMessage输出。
打开RTC_DLOG

src\third_party\webrtc_overrides\rtc_base\logging.h
-#define RTC_DLOG_IS_ON 0 //原来是0,强制改为1
+#define RTC_DLOG_IS_ON 1

7)media模块的DVLOG:

DVLOG(1) << "HTMLMediaElement(" << (void*)this << ")";//HTMLMediaElement构造函数里面的log
输出media模块的DVLOG需要media/media_options.gni添加use_t_embedded宏
-  enable_logging_override = !use_jumbo_build && is_chromecast
+  enable_logging_override = !use_jumbo_build && (is_chromecast || use_t_embedded)
之后DVLOG即可使用LOG输出,级别的INFO
#define DVLOG(verboselevel) LOG(INFO)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,135评论 6 514
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,317评论 3 397
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,596评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,481评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,492评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,153评论 1 309
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,737评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,657评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,193评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,276评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,420评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,093评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,783评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,262评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,390评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,787评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,427评论 2 359

推荐阅读更多精彩内容