mirror of
https://github.com/facebook/rocksdb.git
synced 2024-11-26 16:30:56 +00:00
66da467983
Summary: Moved LogBuffer class to an internal header. Removed some unneccesary indirection. Enabled log buffer for BackgroundCallFlush. Forced log buffer flush right after Unlock to improve time ordering of info log. Test Plan: make check; db_bench compare LOG output Reviewers: sdong Reviewed By: sdong CC: leveldb, igor Differential Revision: https://reviews.facebook.net/D16707
68 lines
1.9 KiB
C++
68 lines
1.9 KiB
C++
// Copyright (c) 2014, Facebook, Inc. All rights reserved.
|
|
// This source code is licensed under the BSD-style license found in the
|
|
// LICENSE file in the root directory of this source tree. An additional grant
|
|
// of patent rights can be found in the PATENTS file in the same directory.
|
|
|
|
#include "util/log_buffer.h"
|
|
|
|
#include <sys/time.h>
|
|
|
|
namespace rocksdb {
|
|
|
|
LogBuffer::LogBuffer(const InfoLogLevel log_level,
|
|
Logger*info_log)
|
|
: log_level_(log_level), info_log_(info_log) {}
|
|
|
|
void LogBuffer::AddLogToBuffer(const char* format, va_list ap) {
|
|
if (!info_log_ || log_level_ < info_log_->GetInfoLogLevel()) {
|
|
// Skip the level because of its level.
|
|
return;
|
|
}
|
|
|
|
const size_t kLogSizeLimit = 512;
|
|
char* alloc_mem = arena_.AllocateAligned(kLogSizeLimit);
|
|
BufferedLog* buffered_log = new (alloc_mem) BufferedLog();
|
|
char* p = buffered_log->message;
|
|
char* limit = alloc_mem + kLogSizeLimit - 1;
|
|
|
|
// store the time
|
|
gettimeofday(&(buffered_log->now_tv), nullptr);
|
|
|
|
// Print the message
|
|
if (p < limit) {
|
|
va_list backup_ap;
|
|
va_copy(backup_ap, ap);
|
|
p += vsnprintf(p, limit - p, format, backup_ap);
|
|
va_end(backup_ap);
|
|
}
|
|
|
|
// Add '\0' to the end
|
|
*p = '\0';
|
|
|
|
logs_.push_back(buffered_log);
|
|
}
|
|
|
|
void LogBuffer::FlushBufferToLog() {
|
|
for (BufferedLog* log : logs_) {
|
|
const time_t seconds = log->now_tv.tv_sec;
|
|
struct tm t;
|
|
localtime_r(&seconds, &t);
|
|
Log(log_level_, info_log_,
|
|
"(Original Log Time %04d/%02d/%02d-%02d:%02d:%02d.%06d) %s",
|
|
t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min,
|
|
t.tm_sec, static_cast<int>(log->now_tv.tv_usec), log->message);
|
|
}
|
|
logs_.clear();
|
|
}
|
|
|
|
void LogToBuffer(LogBuffer* log_buffer, const char* format, ...) {
|
|
if (log_buffer != nullptr) {
|
|
va_list ap;
|
|
va_start(ap, format);
|
|
log_buffer->AddLogToBuffer(format, ap);
|
|
va_end(ap);
|
|
}
|
|
}
|
|
|
|
} // namespace rocksdb
|