前几天在和松华一起分析花屏的问题上遇到了难题。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文件充满整个存储卡。