程序每次启动都会生成一个日志,为防止常年累月日志过多,本程序设置最多保留5个
只保留最新的5 个log
logprocessor.h
#ifndef LOGPROCESSOR
#define LOGPROCESSOR
#include <stdio.h>
#include "glog/logging.h"
#include "glog/raw_logging.h"
#define OutputLog_Info(format, ...) \
{\
char szLog[1024 * 5] = { 0 }; \
sprintf(szLog, format, ##__VA_ARGS__); \
LOG(INFO) << szLog; \
}
#define OutputLog_Warning(format, ...) \
{\
char szLog[1024 * 5] = { 0 }; \
sprintf(szLog, format, ##__VA_ARGS__); \
LOG(WARNING) << szLog; \
}
#define OutputLog_Error(format, ...) \
{\
char szLog[1024 * 5] = { 0 }; \
sprintf(szLog, format, ##__VA_ARGS__); \
LOG(ERROR) << szLog; \
}
class LogProcessor
{
public:
LogProcessor();
~LogProcessor() { google::ShutdownGoogleLogging(); }
};
#endif // LOGPROCESSOR
logprocessor.cpp
#include <stdlib.h>
#include <stdio.h>
#include <chrono>
#include <iostream>
#include <io.h>
#include <fstream>
#include <string>
#include <vector>
#include "logprocessor.h"
//配置输出日志的目录:
#define LOGDIR "log"
#define MKDIR "mkdir "LOGDIR
using namespace google;
static int Index = 0;
//将信息输出到单独的文件和 LOG(ERROR)
void SignalHandle(const char* data, int size)
{
std::string str = std::string(data, size);
/*
std::ofstream fs("glog_dump.log",std::ios::app);
fs<<str;
fs.close();
*/
LOG(ERROR) << str;
//也可以直接在这里发送邮件或短信通知,不过这个方法是被回调多次的(每次回调只输出一行错误信息,所以如上面的记录到文件,也需要>以追加模式方可),所以这里发邮件或短信不是很适合,不过倒是可以调用一个 SHELL 或 PYTHON 脚本,而此脚本会先 sleep 3秒左右,然后将错
//误信息通过邮件或短信发送出去,这样就不需要监控脚本定时高频率执行,浪费效率了。
}
long long getCurrentMs()
{
auto time_now = std::chrono::system_clock::now();
auto duration_in_ms = std::chrono::duration_cast<std::chrono::milliseconds>(time_now.time_since_epoch());
return duration_in_ms.count();
}
std::string getCurrentSystemTime()
{
auto tt = std::chrono::system_clock::to_time_t
(std::chrono::system_clock::now());
struct tm* ptm = localtime(&tt);
char date[60] = { 0 };
sprintf(date, "%d-%02d-%02d-%02d.%02d.%02d",
(int)ptm->tm_year + 1900, (int)ptm->tm_mon + 1, (int)ptm->tm_mday,
(int)ptm->tm_hour, (int)ptm->tm_min, (int)ptm->tm_sec);
return std::string(date);
}
void GetAllFiles(std::string path, std::vector<std::string>& files)
{
intptr_t hFile = 0;
//文件信息
struct _finddata_t fileinfo;//用来存储文件信息的结构体
std::string p;
if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1) //第一次查找
{
do
{
if ((fileinfo.attrib & _A_SUBDIR)) //如果查找到的是文件夹
{
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0) //进入文件夹查找
{
files.push_back(p.assign(path).append("\\").append(fileinfo.name));
GetAllFiles(p.assign(path).append("\\").append(fileinfo.name), files);
}
}
else //如果查找到的不是是文件夹
{
//files.push_back(p.assign(fileinfo.name)); //将文件路径保存,也可以只保存文件名: p.assign(path).append("\\").append(fileinfo.name)
files.push_back(p.assign(path).append("\\").append(fileinfo.name));
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile); //结束查找
}
}
int com(const void *a, const void *b)
{
long long * p1, *p2;
p1 = (long long *)a; //语句6
p2 = (long long *)b; //语句7
return *p1 > *p2 ? 1 : -1;
}
//GLOG配置:
LogProcessor::LogProcessor()
{
system(MKDIR);
google::InitGoogleLogging("CVS");
google::SetStderrLogging(GLOG_INFO); //设置级别高于 google::INFO 的日志同时输出到屏幕
FLAGS_colorlogtostderr = true; //设置输出到屏幕的日志显示相应颜色
std::vector<std::string> files;
std::vector<long long> filesNum;
GetAllFiles(std::string(LOGDIR), files);
for (int i = 0; i < files.size(); i++)
{
int pos0 = files[i].find("LOG_");
std::string cut = files[i].substr(pos0 + 4, files[i].size());
char* endptr = NULL;
long long num = std::strtoll(cut.c_str(), &endptr, 10);
printf("cut = %s num = %lld \n", cut.c_str(), num);
filesNum.push_back(num);
}
qsort(&filesNum.data()[0], filesNum.size(), sizeof(long long), com);
// log 日志只保留5 个
if (filesNum.size() > 5)
{
printf("将要删除的数量 delete num = %d \n", filesNum.size() - 5);
long long deleteNum = filesNum.size() - 5;
for (int i = 0; i < deleteNum; i++)
{
std::string logPath = LOGDIR + std::string("/LOG_") + std::to_string(filesNum[i]);
printf("删除的文件= %s \n", logPath.c_str());
remove(logPath.c_str());
}
}
std::string logPath = LOGDIR + std::string("/LOG_") + std::to_string(getCurrentMs());
//std::string logPath = LOGDIR + std::string("/LOG_") + std::to_string(Index);
std::cout << logPath;
google::SetLogDestination(GLOG_INFO, logPath.c_str()); //设置 google::INFO 级别的日志存储路径和文件名前缀
google::SetLogDestination(GLOG_WARNING, logPath.c_str()); //设置 google::WARNING 级别的日志存储路径和文件名前缀
google::SetLogDestination(GLOG_ERROR, logPath.c_str()); //设置 google::ERROR 级别的日志存储路径和文件名前缀
FLAGS_logbufsecs = 0; //缓冲日志输出,默认为30秒,此处改为立即输出
FLAGS_max_log_size = 100; //最大日志大小为 100MB
FLAGS_stop_logging_if_full_disk = true; //当磁盘被写满时,停止日志输出
}
main.cpp
#include <stdio.h>
#include "logprocessor.h"
int main()
{
LogProcessor mLog;
for (int i = 0; i < 1000; i++)
{
OutputLog_Error("hello world .... i = %d \n", i);
}
return 0;
}