GLog在嵌入式系统上的应用

前几天在和松华一起分析花屏的问题上遇到了难题。bug不能重现,也没有log,分析无从下手。即便用SecureCRT工具抓些log,但感觉log也不能满足需要,没有日期、时间、进程号、文件名等信息,更不能长期保存。因此有必要研究一种新的log机制,即能记录软件运行的重要数据,又能长期保存。

1.GLog简介

Google Glog是一个C++语言的应用级日志记录框架,提供了C++风格的流操作和各种助手宏。GLog有以下特点:

  • glog有四种日志等级INFO < WARING < ERROR < FATAL,不同等级的日志是打印到不同文件的,低等级的日志文件中(INFO)会包含高等级的日志信息(ERROR)
  • 通过命令行传递参数 --log_dir指定日志文件的存放目录,默认为os.TempDir()
  • 可以根据文件大小切割日志文件
  • 日志输出格式是固定的(Lmmddhh:mm:ss.uuuuuuthreadid file:line] msg...)不可以自定义
  • 在程序开始时需要调用flag.Parse()解析命令行参数,在程序退出时需要调用glog.Flush() 确保将缓存区中的内容输出到文件中

2.Glog下载

GitHub - google/glog: C++ implementation of the Google logging module下载glog-0.5.0-rc2.zip(其它版本的不要下载)

3.Glog在黑芝麻B01上的编译和安装

3.1 Glog在黑芝麻B01上的编译和安装
将glog-0.5.0-rc2.zip解压缩,将生成glog-0.5.0-rc2目录。
3.2 在B01 docker中进入glog-0.5.0-rc2目录。
3.3 修改 toolchains/gcc-cxx11.cmake 文件中的编译器,改成B01所使用的编译器,如下图。
3.4 指定CMake文件

cmake -H. -B_build -DCMAKE_TOOLCHAIN_FILE="${PWD}/toolchains/gcc-cxx11.cmake "

3.5 编译

cmake --build ./_build/

3.6 安装

cd_build

make DESTDIR=./out install

_build/out就是生成的glog的库

4.GLog的测试和验证

4.1准备一个glogtest.cpp文件,如下。

#define GLOG_NO_ABBREVIATED_SEVERITIES

#include <glog/logging.h>

#include <iostream>

#include <vector>

#include <stdlib.h>

#include <time.h>

#include <unistd.h>



using namespace std;



int main(intargc, char * argv[])

{

   FLAGS_log_dir = "mylog";

   google::SetLogFilenameExtension(".log");

   google::InitGoogleLogging("AlgLog");

   FLAGS_logbufsecs = 0;//刷新日志buffer的时间,0就是立即刷新

   FLAGS_max_log_size = 1;//日志文件大小 1MB , 满了之后就是下一个日志文件

  

   cout<<"glog test"<<endl;



   LOG(INFO)<<"google info log";

   LOG(WARNING)<<"google warning log";

   LOG(ERROR)<<"google error log";



   char c ;

   for(c = 'a'; c <='z'; c++){

      for(inti = 0; i< 2000; i ++){

          LOG(INFO)<<c;

          usleep(10);

      }



   }

   google::FlushLogFiles(google::GLOG_INFO);



   return EXIT_SUCCESS;

}

4.2 B01 docker下编译

aarch64-bst-linux-g++ --sysroot=/opt/bstos/1.2.0.3/sysroots/aarch64-bst-linux glogtest.cpp -L ./glog-0.5.0-rc2/_build/out/usr/local/lib/ -lglog  -o glogtest

4.3把glogtest拷贝到B01开发板的/opt/vision_sdk/,把_build/out/usr/local/lib/下的SO库拷贝到/opt/vision_sdk/project/app_libs/

4.4 在/opt/vision_sdk下创建mylog目录

4.5 指定动态库export LD_LIBRARY_PATH=/opt/vision_sdk/project/app_libs/:$LD_LIBRARY_PATH

4.6 加上可执行权限

chmod 777 glogtest

4.7 运行

./glogtest

4.8 mylog目录下生成的log文件

Log内容:

Log的日期时间、进程号、文件名、行数都显示出来了。

5. 将log限制在一定的大小内

      软件在运行过程中不停的记录log, log文件也必然越来越多,而嵌入式系统的存储空间是有限的,必须对log文件做必要的限制。

      FLAGS_max_log_size用来限制log文件大小,FLAGS_max_log_size= 100表示当一个log文件达到100MB将会写新的log。我们可以起一个线程或定时器,每一小时检查log文件总大小。若大小超过一定值,如1G,删除最早的log文件,这样可以避免log文件充满整个存储卡。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值