1、概述

glog是Google开源的C++日志库,线程安全的。

  • 日志分级:支持 DEBUG/INFO/WARNING/ERROR/FATAL 5 个级别,FATAL 级别会直接终止程序,便于快速定位严重问题;
  • 自动格式化:自动添加时间、进程 ID、线程 ID、文件名、行号等上下文信息,无需手动拼接;
  • 日志切割:按大小 / 时间自动切割日志文件,避免单日志文件过大;
  • 跨平台:兼容 Linux/Windows/Mac 等主流系统,谷歌内部大量使用,稳定性有保障。

2、编译

1、下载源码(我下载的0.7.0版本)
https://github.com/google/glog.git

2、生成vs工程配置文件
打开cmake-gui程序

3、vs工程配置,这里使用vs2017,编译32位版本

4、生成vs工程文件

点击"Generate",此时build目录下会有glog.sln工程文件

5、打开vs2017编译glog(生成dll)

3、使用

1、设置demo工程依赖glog头文件、lib(glog.dll要拷贝到demo.exe目录)

2、demo代码示例

#ifndef Glog_Manager_h_
#define Glog_Manager_h_ 1

#pragma warning(push)
#pragma warning(disable: 4996)
#pragma warning(disable: 4251)
#pragma warning(disable: 4244)
#include "glog/logging.h"
#pragma warning(pop)

class GlogManager
{
public:
    GlogManager() = default;
    ~GlogManager() = default;

public:
    // minlevel
    // 日志级别优先级:INFO < WARNING < ERROR < FATAL(FATAL 会终止程序)
    // 低于该级别的日志不输出
    static void Init(int minlevel);
    static void Unit();
};

#endif
#include "GlogManager.h"

void GlogManager::Init(int minlevel)
{
    // 日志目录
    FLAGS_log_dir = "F:\\logs";

    // 设置日志级别(低于该级别的日志不输出)
    FLAGS_minloglevel = minlevel;

    // 立即输出日志
    FLAGS_logbufsecs = 0;

    // 关闭日志文件头中的「运行时长」和「日志行格式说明」
    FLAGS_log_file_header = false;

    // 关闭时间戳出现在文件名中
    FLAGS_timestamp_in_logfile_name = false;

    // 单个日志文件最大10M
    FLAGS_max_log_size = 10;

    // 磁盘满时停止写日志
    FLAGS_stop_logging_if_full_disk = true;

    // 清理超过7天的日志
    google::EnableLogCleaner(std::chrono::minutes(7 * 24 * 60));

    // 初始化glog
    google::InitGoogleLogging("MyTestDemo");
}

void GlogManager::Unit()
{
    google::ShutdownGoogleLogging();
}
    // 调用示例
    // glog使用
    GlogManager::Init(google::LogSeverity::GLOG_INFO);
    for (int i = 0; i < 10; ++i)
    {
        LOG(INFO) << "这是info日志";
        LOG(WARNING) << "这是warning日志";
        LOG(ERROR) << "这是error日志";
        // LOG(FATAL) << "这是FATAL日志";
    }
    GlogManager::Unit();

注意点:需要预定义宏,否则会有编译报错和警告
GLOG_USE_GLOG_EXPORT
GLOG_NO_ABBREVIATED_SEVERITIES

4、生成日志

发现如下打印日志代码,却生成了3个日志文件,info文件,waring文件、error文件(如上图)

LOG(INFO) << "这是info日志";
LOG(WARNING) << "这是warning日志";
LOG(ERROR) << "这是error日志";

打开info日志,发现info日志中包含info、waring、error日志
打开waring日志,发现info日志中包含waring、error日志
打开error日志,发现info日志中包含waring、error日志

glog 默认会将所有级别 ≥ 当前日志级别的日志输出到对应级别的文件中

一个模块日志一般写到一个文件中,对此你有什么想法么
目前想法:
1、项目中全都调用LOG(INFO)打印日志
2、保留glog默认行为,INFO日志中有全部日志,ERROR中仅有error日志
3、修改glog源码,为所有级别日志输出到一个文件中,不生成多个日志文件
4、使用其他日志库,例如spdlog

准备采用方法3,等修改好,更新到我的资源文件中,需要的小伙伴可以去下载。

4、学习

日志文件名为:[程序名].[主机名].[用户名].log.[级别].[时间戳].[进程ID]
如果想学习如何获主机名,用户名、是不是就可以直接去看glog源码了,其他功能也类似。
比如获取主机的代码:

static void GetHostName(string* hostname) {
#if defined(HAVE_SYS_UTSNAME_H)
  struct utsname buf;
  if (uname(&buf) < 0) {
    // ensure null termination on failure
    *buf.nodename = '\0';
  }
  *hostname = buf.nodename;
#elif defined(GLOG_OS_WINDOWS)
  char buf[MAX_COMPUTERNAME_LENGTH + 1];
  DWORD len = MAX_COMPUTERNAME_LENGTH + 1;
  if (GetComputerNameA(buf, &len)) {
    *hostname = buf;
  } else {
    hostname->clear();
  }
#else
#  warning There is no way to retrieve the host name.
  *hostname = "(unknown)";
#endif
}
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐