最近采用了glog作为一个项目的日志库,作为轻量级日志库,其功能完备,下面列举了一些大家常用的日志配置。
场景一:将日志输出到指定文件夹和终端中:
#include <iostream>
#include "glog/logging.h"
using namespace std;
int main(int argc, char** argv)
{
google::InitGoogleLogging(argv[0]); // 初始化日志库
FLAGS_log_dir="./log/"; // 设置日志存放路径
FLAGS_alsologtostderr = 1; // 日志同时输出到stderr
LOG(INFO) << "This is INFO data"; // 打印INFO等级日志
LOG(WARNING) << "This is WARNING data"; // 打印WARNING等级日志
LOG(ERROR) << "This is ERROR data"; // 打印ERROR等级日志
LOG(FATAL) << "This is FATAL data"; // 打印FATAL等级日志
return 0;
}
结果存储在<program name>.<host name>.<user name>.log.<Severity level>.<date>-<time>.<pid>格式的文件中
场景二:将指定级别的日志写入到文件中
#include <iostream>
#include "glog/logging.h"
using namespace std;
int main(int argc, char** argv)
{
google::InitGoogleLogging(argv[0]); // 初始化日志库
FLAGS_minloglevel = google::ERROR; // 只记录大于等于ERROR等级的日志
FLAGS_log_dir="./log/"; // 设置日志存放路径
FLAGS_alsologtostderr = 1; // 日志同时输出到stderr
LOG(INFO) << "This is INFO data"; // 打印INFO等级日志
LOG(WARNING) << "This is WARNING data"; // 打印WARNING等级日志
LOG(ERROR) << "This is ERROR data"; // 打印ERROR等级日志
LOG(FATAL) << "This is FATAL data"; // 打印FATAL等级日志
return 0;
}
gllog日志等级划分为GLOG_INFO = 0, GLOG_WARNING = 1, GLOG_ERROR = 2, GLOG_FATAL = 3,当最小日志级别设置为ERROR时,INFO和WARNING日志内容将不记录。
场景三:根据条件写入指定日志
#include <iostream>
#include "glog/logging.h"
using namespace std;
int main(int argc, char** argv)
{
google::InitGoogleLogging(argv[0]); // 初始化日志库
FLAGS_minloglevel = google::ERROR; // 只记录大于ERROR等级的日志
FLAGS_log_dir="./log/"; // 设置日志存放路径
FLAGS_alsologtostderr = 1; // 日志同时输出到stderr
for(int i = 0; i < 10; i++)
{
LOG_IF(ERROR, i < 3) << i;
}
return 0;
}
场景四:将程序段错误信息记录到日志
#include <iostream>
#include "glog/logging.h"
using namespace std;
void (writer)(const char* data, int size)
{
LOG(ERROR) << data;
}
void dump()
{
char buf[3];
memcpy(buf, "12345678", 102400);
}
int main(int argc, char** argv)
{
google::InitGoogleLogging(argv[0]); // 初始化日志库
FLAGS_minloglevel = google::ERROR; // 只记录大于ERROR等级的日志
FLAGS_log_dir="./log/"; // 设置日志存放路径
FLAGS_alsologtostderr = 1; // 日志同时输出到stderr
google::InstallFailureSignalHandler(); // 捕捉信号
google::InstallFailureWriter(&writer); // 打印错误信息
dump();
return 0;
}
场景五:持久化记录日志,设置日志大小,删除旧日志
#include <iostream>
#include "glog/logging.h"
using namespace std;
void write()
{
for(int i = 0; i < 2048; i++)
{
char data[1025] = {0};
memset(data, '1', sizeof(data)-1);
LOG(INFO) << i << data;
}
}
int main(int argc, char** argv)
{
google::InitGoogleLogging(argv[0]); // 初始化日志库
FLAGS_log_dir="./log/"; // 设置日志存放路径
FLAGS_alsologtostderr = 1; // 日志同时输出到stderr
FLAGS_max_log_size = 1; // 单个日志文件大小上限(MB), 如果设置为0将默认为1
FLAGS_stop_logging_if_full_disk = true; // 当磁盘写满时,停止输出
write();
return 0;
}
当明确了日志存储地址以及单个文件大小以后,可以随程序启动一个shell脚本,当日志目录文件个数超过指定上限时,删除旧日志。
一般来说可以不建议删除ERROR级别以上的文件。
#bin/bash
#本脚本用于删除glog目录下旧的INFO级别日志
#glog日志路径
log_path="/mnt/hgfs/test/log"
#监听频率 3秒扫描一次
monitor_time=3
#是否开启监听
working_flag=true
#当日志文件超过该值则删除旧文件
file_number_threshould=10
cd $log_path
while $working_flag
do
#判断日志文件个数是否超过阀值
file_number=$(ls -l | grep "a.wang-virtual-machine.wang.log.INFO*" | wc -l )
if [ $file_number -gt $file_number_threshould ]
then
#把文件按从旧到新的顺序排列,删除旧日志,保留最新的10个日志文件
declare -i delete_number=$(expr $file_number - $file_number_threshould )
rm -r $(ls -rt | head -n$delete_number)
fi
sleep $monitor_time #休眠
done
监控脚本启动前:
监控脚本启动后