天天看点

google-glog:开源c++轻量级日志库glog简介安装 和 使用主要内容

glog简介

Google glog is a library that implements application-level logging. This library provides logging APIs based on C++-style streams and various helper macro.

  • 参数设置,以命令行参数的方式设置标志参数来控制日志记录行为;
  • 严重性分级,根据日志严重性分级记录日志;
  • 可有条件地记录日志信息;
  • 条件中止程序。丰富的条件判定宏,可预设程序终止条件;
  • 异常信号处理。程序异常情况,可自定义异常处理过程;
  • 支持debug功能;
  • 自定义日志信息;
  • 线程安全日志记录方式;
  • 系统级日志记录;
  • google perror风格日志信息;
  • 精简日志字符串信息

安装 和 使用

下载地址:

https://code.google.com/p/google-glog/downloads/list

解压安装:

tar zxvf glog-.tar.gz && cd glog- && ./configure && make
           

头文件目录为 /src/glog ,链接库为 .libs/libglog.{a,so}

帮助文档为 doc/glog.html 或直接访问以下 URL: http://google-glog.googlecode.com/svn/trunk/doc/glog.html

简单Demo

#include <glog/logging.h>

int main(int argc,char* argv[])
{
    LOG(INFO) << "Hello,GLOG!";
}
           

只需要include logging.h头文件 链接时,需要 -lglog -lpthread

主要内容

日志

日志等级

enum SeverityLevel
{
  google::INFO = ,
  google::WARNING = ,
  google::ERROR = ,
  google::FATAL = ,
};
           

在输出FATAL日志消息后,会终止程序运行

DEBUG模式中,DFATAL级别对应ERROR–便于调试,而非DEBUG模式则对应FATAL

日志文件

每个级别都对应有相应的日志文件,日志文件的位置及名称定义如下:

  • windows下是”C:\Users\user_name\AppData\Local\Temp”
  • Linux是”/tmp”

文件名称:

programname.hostname.user_name.log.severity_level.date.time.pid

Linux还会创建为每个文件创建一个文件链接

如果日志输出超过 FLAGS_max_log_size 设置的大小,则会分为多个文件存储,链接文件就会指向其中最新的对应级别的日志文件。所以当日志文件较多时,查看链接文件来查看最新日志挺方便的。

输出规则:

- 每个级别的日志除了输出到对应日志文件中,还输出到每个低级别日志文件中

- 如一个ERROR日志,会输出到INFO,WARNING,ERROR三个日志文件中

- 默认,ERROR和FATAL消息除了输出到日志文件中之外,还会输出到标准错误中

符号变量

通过符号变量可以定制日志行为

在程序中,通过修改全局变量(使用前缀”FLAGS_”)来设置符号变量

- 大多数符号变量修改后会立即生效

- 与输出位置有关(如FLAGS_log_dir),如果要生效需要在google::InitGoogleLogging()之前设置

列举符号变量

(可参见源码src/glog/logging.h line:321-361):

  • logtostderr(bool,default=false),只输出到STDERR而不写入日志文件
  • stderrthreshold(int,default=ERROR),高于该级别的日志除写入日志文件还输出到STDERR
  • minloglevel(int,default=INFO),低于该级别的日志消息不输出
  • colorlogtostderr(bool, default=false),将输出到 stderr 上的错误日志显示相应的颜色
  • log_dir(string,default=”“),日志输出目录
  • v(int,default=0),小于等于该值的VLOG(m)会被输出,否则不会输出
  • vmodule(string,default=”“),可为源文件定制VLOG日志输出级别
  • max_log_size(int,default=1800),日志文件最大值(单位MB)
  • log_link(string,default=”“),日志文件的连接所在的文件夹
  • stop_logging_if_full_disk(bool,default=false),如果磁盘写满是否停止记录日志
  • alsologtoemail(string,default=”“),是否将日志额外发送邮件到指定地址
  • logemaillevel(int,default=999),设置发送邮件的日志等级
  • logmailer(string,default=”/bin/mail”),发送邮件程序

APIs

  • void google::InitGoogleLogging(const char* argv0)

    初始化glog库,参数是第一个命令行参数即程序名

  • void google::ShutdownGoogleLogging()

    关闭glog库

  • void google::FlushLogFiles(LoSeverity min_severity)

    [Thread-safe]指定级别以上的所有日志消息都立即写入到日志文件

  • void google::FlushLogFilesUnsafe(LogSeverity min_severity)

    非线程安全的输出指定级别以上的日志消息,用于灾难性程序问题时输出必要的日志消息

  • void google::SetLogDestination(LogSeverity severity,const char*

    base_filename)

    [Thread-safe]设置指定级别的日志输出的日志文件,如果base_filename为”“则表示该级别日志不输出

  • void google::SetLogSymlink(LogSeverity severity,const char*

    symlink_basename)

    [Thread-safe]设置置顶级别的日志文件的软连接,symlik_basename为空表示不设置软连接。如果不调用该函数,系统默认连接名称是程序名

  • void google::AddLogSink(LogSink *destination)

    void google::RemoveLogSink(LogSink *destination)

    Thread-safe]添加和删除日志输出渠道

  • void google::SetLogFilenameExtension(const char* filename_extension)

    [Thread-safe]为所有日志文件添加文件扩展名,特别用于SetLogDestination()设置的日志文件

    通常做法是将监听的端口号作为日志文件扩展名

  • void google::SetStderrLogging(LogSeverity

    min_severity)

    [Thread-safe]确定除了输出到日志文件同时还输出到STDERR的日志最小级别

  • void google::LogToStderr()

    [Thread-safe]设置只只将日志输出到STDERR而不输出到日志文件

  • void google::SetEmailLogging(LogSeverity min_severity,const char* address)

    [Thread-safe]设置发送邮件的日志最小级别

  • bool google::SendEmail(const char dest,const char subject,const char *body)

    [Thread-safe]发送邮件

  • const std::vector& google::GetLoggingDirectories()

    获取日志输出目录集合

  • void google::InstallFailureSignalHandler()

    信号处理函数,处理的主要信号有SIGSEGV/SIGILL/SIGFPE/SIGBRT/SIGBUS/SIGTERM

  • void google::InstallFailureWriter(void (writer)(const char data,int size))

    设置系统崩溃时的输出函数,data数据不一定是以’\0’结尾

  • void google::InstallFailureFunction(void (*fail_func)())

    设置LOG(FATAL)在输出日志消息后调用的函数

处理core dumped

通过 google::InstallFailureSignalHandler()注册,默认捕捉 SIGSEGV 信号信息输出会输出到 stderr;

通过 google::InstallFailureFunction(void (*func)())定制错误处理

通过 google::InstallFailureWriter(void (writer)(const char data,int size)) 自定义输出方式,例如:

#include <glog/logging.h>
#include <string>
#include <fstream>

//将信息输出到单独的文件和 LOG(ERROR)
void SignalHandle(const char* data, int size)
{
    std::ofstream fs("glog_dump.log",std::ios::app);
    std::string str = std::string(data,size);
    fs<<str;
    fs.close();
    LOG(ERROR)<<str;
}

class GLogHelper
{
public:
    GLogHelper(char* program)
    {
        google::InitGoogleLogging(program);
        FLAGS_colorlogtostderr=true;
        google::InstallFailureSignalHandler();
        //默认捕捉 SIGSEGV 信号信息输出会输出到 stderr,可以通过下面的方法自定义输出方式:
        google::InstallFailureWriter(&SignalHandle);
    }
    ~GLogHelper()
    {
        google::ShutdownGoogleLogging();
    }
};

void fun()
{
    int* pi = new int;
    delete pi;
    pi = ;
    int j = *pi;
}

int main(int argc,char* argv[])
{
    GLogHelper gh(argv[]);
    fun();
}
           

条件宏

  • LOG_IF(INFO, num_cookies > 10) << “Got lots of cookies”;

    上面的语句表示,只有当num_cookies > 10条件成立时,“Got lots of cookies”日志信息才被记录。

  • LOG_EVERY_N(INFO, 10) << “Got the ” << COUNTER << “th cookie”;

    上面的语句表示,在程序中周期性的记录日志信息,在该语句第1、11、21……次被执行的时候,记录日志信息。COUNTER变量表示该语句被执行的次数。

  • LOG_IF_EVERY_N(INFO, (size > 1024), 10) << “Got the ” << COUNTER<<”th big cookie”;

    上面的语句为前两项功能的合并,size>1024的条件连续成立10次的时候记录日志信息。COUNTER变量表示该条件成立的次数。

  • LOG_FIRST_N(INFO, 20) << “Got the ” << COUNTER << “th cookie”;

    上面的语句表示,当该语句只在首次执行了20次以后记录日志信息, COUNTER变量表示该语句被执行的次数。

条件宏中,如果为假则右边日志中的函数不会执行

CHECK 宏

当通过该宏指定的条件不成立的时候,程序会中止,并且记录对应的FATAL日志信息。功能类似于ASSERT,区别是 CHECK 宏不受 NDEBUG 约束,在 release 版中同样有效。

  • CHECK(condition)

    参数会是匿名参数如CHECK(string(“abc”)[1],’b’)

  • 比较验证:

    在输出中会输出比较值,所以要求比较值重载了输出操作符(operator<<(ostream,…))

    • CHECK_EQ(arg1,arg2)
    • CHECK_NE(arg1,arg2)
    • CHECK_LE(arg1,arg2)
    • CHECK_LT(arg1,arg2)
    • CHECK_GE(arg1,arg2)
    • CHECK_GT(arg1,arg2)
  • CHECK_NOTNULL(arg)

    不能作为日志输出流使用

  • 字符串比较:
    • CHECK_STREQ
    • CHECK_STRNE
    • CHECK_STRCASEEQ
    • CHECK_STRCASENE
  • 浮点数验证:
    • CHECK_DOUBLE_EQ
    • CHECK_NEAR

TODO

  • 定制日志(Verbose Logging)
  • debug功能
  • ……

参考:

google-glog 开源库分析

glog

google-glog功能介绍

继续阅读