| // Copyright (c) 2011-present, Facebook, Inc. All rights reserved. |
| // This source code is licensed under both the GPLv2 (found in the |
| // COPYING file in the root directory) and Apache 2.0 License |
| // (found in the LICENSE.Apache file in the root directory). |
| |
| #pragma once |
| |
| #include "rocksdb/env.h" |
| #include "util/arena.h" |
| #include "util/autovector.h" |
| #include "port/sys_time.h" |
| #include <ctime> |
| |
| namespace rocksdb { |
| |
| class Logger; |
| |
| // A class to buffer info log entries and flush them in the end. |
| class LogBuffer { |
| public: |
| // log_level: the log level for all the logs |
| // info_log: logger to write the logs to |
| LogBuffer(const InfoLogLevel log_level, Logger* info_log); |
| |
| // Add a log entry to the buffer. Use default max_log_size. |
| // max_log_size indicates maximize log size, including some metadata. |
| void AddLogToBuffer(size_t max_log_size, const char* format, va_list ap); |
| |
| size_t IsEmpty() const { return logs_.empty(); } |
| |
| // Flush all buffered log to the info log. |
| void FlushBufferToLog(); |
| |
| private: |
| // One log entry with its timestamp |
| struct BufferedLog { |
| struct timeval now_tv; // Timestamp of the log |
| char message[1]; // Beginning of log message |
| }; |
| |
| const InfoLogLevel log_level_; |
| Logger* info_log_; |
| Arena arena_; |
| autovector<BufferedLog*> logs_; |
| }; |
| |
| // Add log to the LogBuffer for a delayed info logging. It can be used when |
| // we want to add some logs inside a mutex. |
| // max_log_size indicates maximize log size, including some metadata. |
| extern void LogToBuffer(LogBuffer* log_buffer, size_t max_log_size, |
| const char* format, ...); |
| // Same as previous function, but with default max log size. |
| extern void LogToBuffer(LogBuffer* log_buffer, const char* format, ...); |
| |
| } // namespace rocksdb |