zoukankan      html  css  js  c++  java
  • glog日志库使用笔记

      日志能方便地诊断程序原因、统计程序运行数据,是大型软件系统必不可少的组件之一。glog 是google的开源日志系统,相比较log4系列的日志系统,它更加轻巧灵活。

      在Github上下载glog,解压后用CMake生成VS2017工程(默认生成的是静态链接库glogd.lib):

      在64位的windows系统中,一个64位进程不能加载一个32位dll,同理一个32位进程也不能加载一个64位dll,因此要注意应用程序和glog库版本的统一。编译成功后,在buildDebug文件夹下会生成glogd.lib库文件。   srcwindows路径下的glog文件夹包含Windows平台所需的头文件:

       使用glog时可以在项目“属性→C/C++→常规→附加包含目录”中设置glog头文件路径,也可以直接将windows/glog文件夹复制到VS2017的安装路径中:C:Program Files (x86)Microsoft Visual Studio2017CommunityVCToolsMSVC14.14.26428include

       新建一个简单的x64的Debug工程进行测试,在“项目属性→链接器→输入→附加依赖项”中加入glogd.lib,并在“项目属性→链接器→常规→附加库目录”中输入glogd.lib的路径。进行编译:

    #include <glog/logging.h>
    
    int main(int argc, char* argv[]) {
        // Initialize Google's logging library.
        google::InitGoogleLogging(argv[0]);
    
        // ...
        int num_cookies = 100;
        LOG(INFO) << "Found " << num_cookies << " cookies";
    
        return 0;
    }

      结果出现错误:

    1>ConsoleApplication1.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) void __cdecl google::InitGoogleLogging(char const *)" (__imp_?InitGoogleLogging@google@@YAXPEBD@Z),该符号在函数 main 中被引用
    1>ConsoleApplication1.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __cdecl google::LogMessage::LogMessage(char const *,int)" (__imp_??0LogMessage@google@@QEAA@PEBDH@Z),该符号在函数 main 中被引用
    1>ConsoleApplication1.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __cdecl google::LogMessage::~LogMessage(void)" (__imp_??1LogMessage@google@@QEAA@XZ),该符号在函数 main 中被引用
    1>ConsoleApplication1.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl google::LogMessage::stream(void)" (__imp_?stream@LogMessage@google@@QEAAAEAV?$basic_ostream@DU?$char_traits@D@std@@@std@@XZ),该符号在函数 main 中被引用
    1>C:UsersThinkpadDesktopConsoleApplication1x64DebugConsoleApplication1.exe : fatal error LNK1120: 4 个无法解析的外部命令

       参考其他文档,在预处理器定义中添加GOOGLE_GLOG_DLL_DECL=宏后解决:

      运行程序发现并没有信息输出到控制台中,如果没有设置日志存放的文件夹,它们会被存放到指定的路径(windows平台上会默认存放到$(LOCALAPPDATA)的Temp文件夹下。如C:UsersThinkpadAppDataLocalTemp,路径中的“Thinkpad”是计算机当前的用户名),你可以找到以特定格式命名的文件,格式为:

    /tmp/<program name>.<hostname>.<user name>.log.<severity level>.<date>.<time>.<pid>

      生成的log文件如下图所示:

      

      打开文件可以看到如下信息:

    Log file created at: 2018/07/14 16:37:30
    Running on machine: ROBO
    Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg
    I0714 16:37:30.196939 15848 consoleapplication1.cpp:14] Found 100 cookies

      上面介绍了日志输出的格式和我们输出的日志信息。glog拥有的4个日志等级:INFO,WARNING,ERROR,FATAL分别对应0,1,2,3。数值越大严重性越高,严重性高的日志不但会保存到自己的日志文件中,还会同时保存到所有比它严重性更低的日志文件中。例如ERROR信息会被同时打印到INFO,WARNING,ERROR日志文件中。添加如下测试代码:

      LOG(INFO) << "google log first info level message!";
      LOG(WARNING) << "google log first warning level message!";
      LOG(ERROR) << "google log first error level message!";

      运行程序生成了三种日志文件:

    // INFO
    Log file created at: 2018/07/14 16:46:28 Running on machine: ROBO Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg I0714 16:46:28.779220 9736 consoleapplication1.cpp:14] google log first info level message! W0714 16:46:28.780218 9736 consoleapplication1.cpp:15] google log first warning level message! E0714 16:46:28.780218 9736 consoleapplication1.cpp:16] google log first error level message! // WARNING Log file created at: 2018/07/14 16:46:28 Running on machine: ROBO Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg W0714 16:46:28.780218 9736 consoleapplication1.cpp:15] google log first warning level message! E0714 16:46:28.780218 9736 consoleapplication1.cpp:16] google log first error level message! // ERROR Log file created at: 2018/07/14 16:46:28 Running on machine: ROBO Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg E0714 16:46:28.780218 9736 consoleapplication1.cpp:16] google log first error level message!

      同时注意控制台输出了错误信息(默认情况下ERROR和FATAL等级的信息会同时被输出到stderr上):

     

      不同于log4系列的日志系统通过配置文件的方式,glog采用命令的方式来来配置参数,还可以直接在程序中指定。比如下面程序指定了输出log的文件夹:

    int main(int argc, char* argv[])
    {
        string home = "./log/";  //要先创建此目录,否则运行报错.
      
        google::InitGoogleLogging(argv[0]);
    
        string info_log = home + "master_info_";
        google::SetLogDestination(google::INFO, info_log.c_str());
    
        string warning_log = home + "master_warning_";
        google::SetLogDestination(google::WARNING, warning_log.c_str());
    
        string error_log = home + "master_error_";
        google::SetLogDestination(google::ERROR, error_log.c_str());
    
        string fatal_log = home + "master_fatal_";
        google::SetLogDestination(google::FATAL, fatal_log.c_str());
    
        // You can specify one of the following severity levels (in increasing order of severity)
        LOG(INFO) << "info";
        LOG(WARNING) << "warning";
        LOG(ERROR) << "error";
        LOG(FATAL) << "fatal";   // Logging a FATAL message terminates the program (after the message is logged)!
    
        return 0;
    }

      在Project目录下(如果直接运行程序则在程序所在路径下)创建log文件夹,运行程序生成的日志会输出到该文件夹中:

      注意,打印FATAL消息会在打印完成后终止程序:

      glog提供了一些调试模式时输出,release模式下不输出的宏,如DLOG,DLOG_IF,DLOG_EVERY_N等。这些宏只有在debug模式下才会输出日志,正常模式下不会输出日志,也不会拖慢应用程序的速度。

      // 如果工程为Debug模式,下面信息会输出,如果是release模式,下面信息不会输出.
        DLOG(INFO) << "DLOG:Debug Mode Message!";

       

      如果要自定义输出log文件的格式,可修改源代码logging.cc文件中相关的函数。

    参考:

    glog简介

    glog 入门教程

    glog使用教程

    Glog使用文档

    glog使用与功能修改

    Google-glog 日志库使用手记

    在Windows上编译、应用glog

    Installing GLog on Windows

    How To Use Google Logging Library (glog)

    google/glog: C++ implementation of the Google logging module

  • 相关阅读:
    微软Silverlight团队关于PDC会议发表官方补充声明(风云翻译版)
    《银光志Silverlight 3.0开发详解与最佳实践》发行第三版总销量过万册
    Silverlight医学PACS诊断分析管理系统【案例分享】
    微软PDC10与最后的恐慌者
    风云的银光志Silverlight4.0教程之与学会使用Frame控件
    WPF案例之生产线控制器管理系统
    WindowsPhone7 经典3D游戏《刺客信条》评测
    Silverlight4开发的炫酷企业网站整站(运行大量特效)
    微软Windows Phone7超越Android、iOS的五大优势
    as3 滤镜学习笔记
  • 原文地址:https://www.cnblogs.com/21207-iHome/p/9297329.html
Copyright © 2011-2022 走看看