31static const std::unordered_map<char, int> log_level_map = {
32 {
'F', 3}, {
'E', 2}, {
'W', 1}, {
'I', 0}};
35 active_buf_.reset(
new std::deque<Msg>());
36 flushing_buf_.reset(
new std::deque<Msg>());
42 CHECK_EQ(state_.load(std::memory_order_acquire), INITTED);
43 state_.store(RUNNING, std::memory_order_release);
44 log_thread_ = std::thread(&AsyncLogger::RunThread,
this);
49 state_.store(STOPPED, std::memory_order_release);
50 if (log_thread_.joinable()) {
54 FlushBuffer(active_buf_);
55 ACHECK(active_buf_->empty());
56 ACHECK(flushing_buf_->empty());
62 if (
cyber_unlikely(state_.load(std::memory_order_acquire) != RUNNING)) {
66 if (message_len > 0) {
67 auto msg_str = std::string(message, message_len);
68 while (flag_.test_and_set(std::memory_order_acquire)) {
71 active_buf_->emplace_back(timestamp, std::move(msg_str),
72 log_level_map.at(message[0]));
73 flag_.clear(std::memory_order_release);
76 if (force_flush && timestamp == 0 && message && message_len == 0) {
82 for (
auto& module_logger : module_logger_map_) {
83 module_logger.second->Flush();
89void AsyncLogger::RunThread() {
90 while (state_ == RUNNING) {
91 while (flag_.test_and_set(std::memory_order_acquire)) {
94 active_buf_.swap(flushing_buf_);
95 flag_.clear(std::memory_order_release);
96 FlushBuffer(flushing_buf_);
97 if (active_buf_->size() < 800) {
98 std::this_thread::sleep_for(std::chrono::milliseconds(1));
103void AsyncLogger::FlushBuffer(
const std::unique_ptr<std::deque<Msg>>& buffer) {
104 std::string module_name =
"";
105 while (!buffer->empty()) {
106 auto& msg = buffer->front();
109 if (module_logger_map_.find(module_name) == module_logger_map_.end()) {
110 std::string file_name = module_name +
".log.INFO.";
111 if (!FLAGS_log_dir.empty()) {
112 file_name = FLAGS_log_dir +
"/" + file_name;
114 module_logger_map_[module_name].reset(
115 new LogFileObject(google::INFO, file_name.c_str()));
116 module_logger_map_[module_name]->SetSymlinkBasename(module_name.c_str());
118 const bool force_flush = msg.level > 0;
119 module_logger_map_.find(module_name)
120 ->second->Write(force_flush, msg.ts, msg.message.data(),
121 static_cast<int>(msg.message.size()));