• 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宏冲突问题,可通过禁用简短日志等级名称来规避
  • 相关阅读:
    LeetCode 382. Linked List Random Node
    LeetCode 398. Random Pick Index
    LeetCode 1002. Find Common Characters
    LeetCode 498. Diagonal Traverse
    LeetCode 825. Friends Of Appropriate Ages
    LeetCode 824. Goat Latin
    LeetCode 896. Monotonic Array
    LeetCode 987. Vertical Order Traversal of a Binary Tree
    LeetCode 689. Maximum Sum of 3 Non-Overlapping Subarrays
    LeetCode 636. Exclusive Time of Functions
  • 原文地址:https://www.cnblogs.com/davidyang2415/p/3861109.html
Copyright © 2020-2023  润新知