chromium中的日志记录其实使用的是libglog
ubuntu下安装libglog: sudo apt install libgoogle-glog-dev
libglog使用例子:
#include <iostream>
#include "glog/logging.h" // glog 头文件
using namespace std;
int main(int argc, char** argv) {
google::InitGoogleLogging(argv[0]); // 初始化
// FLAGS_log_dir="."; //设置log目录,默认打印到"/tmp/程序名.INFO"
LOG(INFO) << "hello glog"; // 打印log:“hello glog. 类似于C++ stream。
}
编译命令: g++ main.cpp -lglog
chromium中logging日志系统初始化:
void InitLogging() {
base::FilePath log_filename;
PathService::Get(base::DIR_EXE, &log_filename);
log_filename = log_filename.AppendASCII("content_shell.log"); //得到当前可执行文件目录下日志文件content_shell.log
logging::LoggingSettings settings;
settings.logging_dest = logging::LOG_TO_ALL; //日志保存到文件和系统调式日志
settings.log_file = log_filename.value().c_str(); //指定日志文件content_shell.log
settings.delete_old = logging::DELETE_OLD_LOG_FILE; //删除旧日志
logging::InitLogging(settings);
logging::SetLogItems(true, true, true, true); //日志保存项: 进程ID、线程ID、时间戳、tick数
}
日志等级:
typedef int LogSeverity;
const LogSeverity LOG_VERBOSE = -1; // This is level 1 verbosity
// Note: the log severities are used to index into the array of names, see log_severity_names.
const LogSeverity LOG_INFO = 0;
const LogSeverity LOG_WARNING = 1;
const LogSeverity LOG_ERROR = 2;
const LogSeverity LOG_FATAL = 3;
const LogSeverity LOG_NUM_SEVERITIES = 4;
日志使用:
1)LOG宏:
LOG就像c++标准库的输出一样重载<<,它有几个常用的等级,
像”VERBOSE“,“INFO”, “WARNING”, “ERROR”, “FATAL”,”NUM_SEVERITIES“等
比如”FATAL”LOG会触发一个断点,并打印出栈回溯信息。
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);
3)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";
4)PLOG宏:
PLOG宏除了输出我们指定的输出信息,后面还附加有系统最后的错误信息,
windows上是GetLastError(),POSIX上是errno的值。
LOG宏分解:
#define LOG(severity) LAZY_STREAM(LOG_STREAM(severity), LOG_IS_ON(severity))
#define LOG_IS_ON(severity) ((::logging::LOG_ ## severity) >= ::logging::GetMinLogLevel())
#define LOG_STREAM(severity) (COMPACT_GOOGLE_LOG_ ## severity.stream())
#define LAZY_STREAM(stream, condition) !(condition) ? (void) 0 : ::logging::LogMessageVoidify() & (stream)
(logging::LOG_INFO < logging::GetMinLogLevel()) ? (void) 0 : logging::LogMessageVoidify() & (logging::LogMessage(__FILE__, __LINE__, LOG_INFO).stream())
LOG(INFO) << "info等级" 分解成
(logging::LOG_INFO < logging::GetMinLogLevel()) ? (void) 0 : logging::LogMessageVoidify() & (logging::LogMessage(__FILE__, __LINE__, LOG_INFO).stream()) << "info等级"