aboutsummaryrefslogtreecommitdiff
path: root/src/base/log/Logger.cpp
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-10-11 19:30:36 +0800
committerYuqian Yang <crupest@crupest.life>2025-10-11 19:30:36 +0800
commitea80856073d4896da5df78d60369b327346a0b56 (patch)
treec5bd85b508374066a66864ba1317129ac49db6fc /src/base/log/Logger.cpp
parent9768b98d46982501c3b34c171aa51389b06add3b (diff)
downloadcru-ea80856073d4896da5df78d60369b327346a0b56.tar.gz
cru-ea80856073d4896da5df78d60369b327346a0b56.tar.bz2
cru-ea80856073d4896da5df78d60369b327346a0b56.zip
Split and log debug tag.
Diffstat (limited to 'src/base/log/Logger.cpp')
-rw-r--r--src/base/log/Logger.cpp43
1 files changed, 34 insertions, 9 deletions
diff --git a/src/base/log/Logger.cpp b/src/base/log/Logger.cpp
index 87a56cd6..e8714f26 100644
--- a/src/base/log/Logger.cpp
+++ b/src/base/log/Logger.cpp
@@ -1,8 +1,10 @@
#include "cru/base/log/Logger.h"
+#include "cru/base/StringUtil.h"
#include "cru/base/log/StdioLogTarget.h"
#include <algorithm>
#include <condition_variable>
+#include <cstdlib>
#include <ctime>
#include <format>
#include <memory>
@@ -68,7 +70,9 @@ std::string MakeLogFinalMessage(const LogInfo &log_info) {
}
} // namespace
-Logger::Logger() : log_stop_(false), log_thread_(&Logger::LogThreadRun, this) {}
+Logger::Logger() : log_stop_(false), log_thread_(&Logger::LogThreadRun, this) {
+ LoadDebugTagFromEnv();
+}
Logger::~Logger() {
{
@@ -79,29 +83,43 @@ Logger::~Logger() {
log_thread_.join();
}
-void Logger::Log(LogInfo log_info) {
-#ifndef CRU_DEBUG
- if (log_info.level == LogLevel::Debug) {
- return;
+void Logger::AddDebugTag(std::string tag) {
+ std::unique_lock lock(log_queue_mutex_);
+ debug_tags_.insert(std::move(tag));
+}
+
+void Logger::RemoveDebugTag(const std::string &tag) {
+ std::unique_lock lock(log_queue_mutex_);
+ debug_tags_.erase(tag);
+}
+
+void Logger::LoadDebugTagFromEnv(const char *env_var, std::string sep) {
+ auto env = std::getenv(env_var);
+ if (env != nullptr) {
+ for (auto tag : Split(std::string(env), sep)) {
+ AddDebugTag(std::move(tag));
+ }
}
-#endif
+}
+void Logger::Log(LogInfo log_info) {
std::unique_lock lock(log_queue_mutex_);
log_queue_.push_back(std::move(log_info));
log_queue_condition_variable_.notify_one();
}
void Logger::LogThreadRun() {
+ std::list<LogInfo> queue;
+ bool stop = false;
+
while (true) {
- std::list<LogInfo> queue;
- bool stop = false;
std::vector<ILogTarget *> target_list;
{
std::unique_lock lock(log_queue_mutex_);
log_queue_condition_variable_.wait(
lock, [this] { return !log_queue_.empty() || log_stop_; });
- std::swap(queue, log_queue_);
+ queue = std::move(log_queue_);
stop = log_stop_;
}
@@ -114,6 +132,13 @@ void Logger::LogThreadRun() {
for (const auto &target : target_list) {
for (auto &log_info : queue) {
+ if (log_info.level == LogLevel::Debug &&
+ std::ranges::none_of(debug_tags_,
+ [&log_info](const std::string &tag) {
+ return log_info.tag.starts_with(tag);
+ })) {
+ continue;
+ }
target->Write(log_info.level, MakeLogFinalMessage(log_info));
}
queue.clear();