Linux下glog编译与功能修改
【前言】
glog是google的日志库,原生的glog库在细节上无法满足我们的需求,需要进行一些修改。本文是根据网上的一些资料,经过尝试(主要是网上资料不详细,坑比较多)后,详细介绍一些简单的格式、功能修改过程。
1、glog编译
1、下载
https://github.com/google/glog
2、解压
tar -zxvf glog-master.zip
3、编译
cd glog-master
./autogen.sh
./configure
make
make install
若编译失败,可能缺少依赖:autoconf automake libtool
2、功能修改
1)增加日志按天输出
PidHasChanged() 定义于 utilities.cc 文件中,可以加一个类似的 DayHasChanged() 函数(注意 utilities.h 文件中加上函数声明,且要与与PidHasChanged()在同一命名空间下):
static int32 g_main_day = 0;
bool DayHasChanged()
{
time_t raw_time;
struct tm tm_info;
time(&raw_time);
localtime_r(&raw_time,&tm_info);
if (tm_info.tm_mday != g_main_day)
{
g_main_day = tm_info.tm_mday;
return true;
}
return false;
}
同时,再logging.cc的LogFileObject::Write()函数中改为
if (static_cast<int>(file_length_ >> 20) >= MaxLogSize() ||
PidHasChanged() || DayHasChanged()) {
2)高级log不往低级log写
glog默认有四种log级别,高级别的log中会包含低级别的log,这个我们也是不需要的,我希望每一个分级一个文件。我增加了一个宏来控制这个开关,以免影响到原来的功能。
1、在logging.h中增加
DECLARE_bool(servitysinglelog);
该修改不会再/usr/loocal/include(安装路径)中,若头文件重这里导出则需手动添加
2、在logging.cc文件中增加
GLOG_DEFINE_bool(servitysinglelog, false, "Prevents high-level logs from writing to low-level logs");
并将 LogDestination::LogToAllLogfiles函数修改
inline void LogDestination::LogToAllLogfiles(LogSeverity severity, time_t timestamp, const char* message, size_t len) {
if ( FLAGS_logtostderr ) { // global flag: never log to file
ColoredWriteToStderr(severity, message, len);
} else {
if(FLAGS_servitysinglelog)
{
LogDestination::MaybeLogToLogfile(severity, timestamp, message, len);
}
else
{
for (int i = severity; i >= 0; --i)
LogDestination::MaybeLogToLogfile(i, timestamp, message, len);
}
}
}
3)修改log输出格式(日志头)
在logging.cc文件中LogMessage::Init()函数中日志头格式
if (FLAGS_log_prefix && (line != kNoLogPrefix)) {
stream() << LogSeverityNames[severity][0] //日志等级第一个字母
<< setw(2) << 1+data_->tm_time_.tm_mon
<< setw(2) << data_->tm_time_.tm_md