• google-glog 开源库分析(一):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 macros.
    

    glog主要内容

    • 日志等级
      • 系统预定义等级:INFO(=0)<WARNING(=1)<ERROR(=2)<FATAL(=3)
        • 以上是简写形式,可通过宏关闭简写形式,其原始定义是有GLOG_前缀
        • 在windows中可能存在ERROR宏冲突的问题,通过宏监测会在编译器提示
      • 最严重级别是FATAL级别,对应DEBUG模式是DFATAL级别
        • 在输出FATAL日志消息后,会终止程序运行
        • DEBUG模式中,DFATAL级别对应ERROR--便于调试,而非DEBUG模式则对应FATAL
      • 每个级别都对应有相应的日志文件,日志文件的位置及名称定义如下:
        • 文件默认存放在临时文件中,windows下是"C:Usersuser_nameAppDataLocalTemp",Linux是"/tmp"
        • 文件名称:programname.hostname.user_name.log.severity_level.date.time.pid
        • Linux系还会创建为每个文件创建一个文件链接
      • 日志输出采用如下规则:
        • 每个级别的日志除了输出到对应日志文件中,还输出到每个低级别日志文件中
        • 如一个ERROR日志,会输出到INFO,WARNING,ERROR三个日志文件中
        • 默认,ERROR和FATAL消息除了输出到日志文件中之外,还会输出到标准错误中
    • 符号变量
      • 通过符号变量可以定制日志行为
      • 设置符号变量的三个方法:
        • 系统装有google-fglags库,在安装google-glog时会自动使用google-fglags库
          • 可通过命令行参数来设置符号变量,如--logtostderr=1
          • PS:网上查找资料时看到内容:使用google-fglags库后vglgrind会提示内存泄漏(未验证)
        • 系统未安装google-fglags库,通过使用前缀"GLOG_"的环境变量可设置符号变量
        • 在程序中,通过修改全局变量(使用前缀"FLAGS_")来设置符号变量
          • 大多数符号变量修改后会立即生效
          • 与输出位置有关(如FLAGS_log_dir),如果要生效需要在google::InitGoogleLogging()之前设置
      • 符号变量包括:
        • logtostderr(bool,default=false),只输出到STDERR而不写入日志文件
        • stderrthreshold(int,default=2,which is ERROR),高于该级别的日志除写入日志文件还输出到STDERR
        • minloglevel(int,default=0,which is INFO),低于该级别的日志消息不输出
        • 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"),发送邮件程序
    • DEBUG模式支持
      • DEBUG模式日志输出形式,增加前缀D表示DEBUG模式日志,如DLOG(log_severity),DLOG_IF(log_severity,condition)
      • 采用DEBUG宏控制,非DEBUG模式中DEBUG日志不会编译进程序就避免了程序冗余
    • 丰富的助手宏
      • 所有助手宏中,因为有条件判断所以需要确认是否要将函数调用放在日志输出中
      • 条件宏:
        • LOG_IF(condition)
      • 计数宏:
        • LOG_EVERY_N(log_severity,num)
        • LOG_IF_EVERY_N(log_severity,condition,num)
        • LOG_FIRST_N(log_severity,num)
        • 使用google::COUNTER计数
      • 验证宏:
        • 功能类似assert断言,但不受DEBUG模式控制即非DEBUG模式也生效
        • 如果验证失败,会写FATAL日志并终止程序运行
        • CHECK(condition)
        • 比较验证:
          • 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
        • 其中CHECK_NOTNULL不能作为日志输出流使用
        • 比较验证中,在输出中会输出比较值,所以要求比较值重载了输出操作符(operator<<(ostream,...))
        • 在验证宏中,参数会是匿名参数如CHECK(string("abc")[1],'b')
    • 定制日志(Verbose Logging)
      • 目的:便于追踪不同的BUG,提供自定义日志级别
      • 级别控制:
        • 日志等级严重性与系统默认正好相反,大于-v设定级别的日志不会输出
        • 默认-v级别是0,级别可定义为负数
      • 日志输出:
        • 所有的VLOG宏日志消息都输出到INFO对应日志文件中
      • VLOG_IS_ON(n)使用:
        • 当n小于或等于-v设定的级别是返回true
      • 辅助宏:
        • 系统定义的辅助宏,都用对应的定制版本,需要加前缀V和更换系统日志级别为定制级别
    • 特地的信号量处理
      • 针对可能导致程序崩溃的信号会输出dump信息
      • 处理的信号包括:
        • SIGSEGV,SIGILL,SIGABRT,SIGBUS,SIGTERM
      • 相关函数:
        • google::InstallFailureSignalHandler()
          • 信号处理函数
        • google::InstallFailureWriter(void (writer)(const char data,int size))
          • 默认dump信息输出到STDERR,可通过该函数定制dump输出目标
    • 其他注意事项
      • 1.条件宏中,如果为假则右边日志中的函数不会执行
      • 2.默认FATAL日志和CHECK*宏会终止程序:
        • 默认会输出堆栈信息后以状态1退出程序
        • 可通过google::InstallFailureFunction(void (*func)())定制错误处理
      • 3.支持线程安全的日志Raw Logging,不分配内存和加解同步锁
      • 4.支持Google Style perror(),在系统日志宏前加前缀P,如PLOG(log_severity)
      • 5.支持Syslog,需要注意的是如果syslog配制为远程日志记录时的性能问题
      • 6.可通过GOOGLE_STRIP_LOG宏,在编译器就过滤掉不要的日志输出
        • 与符号变量minloglevel不用,该宏在编译器进行--即编译后的程序不可更改
        • 该宏同时会影响与INFO相关联的VLOGs日志
      • 7.windows平台,可能存在ERROR宏冲突问题,可通过禁用简短日志等级名称来规避
  • 相关阅读:
    [洛谷P4513][题解]小白逛公园
    [洛谷P2564][题解][SCOI2009]生日礼物
    [洛谷P3384][题解]轻重链剖分
    [洛谷P2607][题解][ZJOI2008]骑士
    第一次个人编程作业
    第一次博客作业
    第一次个人编程作业
    第一次博客作业
    1.初识数据库系统
    1.计算机发展历程
  • 原文地址:https://www.cnblogs.com/davidyang2415/p/3861109.html
Copyright © 2020-2023  润新知