mirror of
https://github.com/gabime/spdlog.git
synced 2024-11-15 08:25:43 +08:00
fix/issue-3101: fix the issue where mdc ignores SPDLOG_NO_TLS (#3184)
Co-authored-by: dyf <yufeng.duan@senscape.com.cn>
This commit is contained in:
parent
2169a6f6ae
commit
362214a349
@ -382,7 +382,9 @@ void replace_default_logger_example() {
|
|||||||
// Mapped Diagnostic Context (MDC) is a map that stores key-value pairs (string values) in thread local storage.
|
// Mapped Diagnostic Context (MDC) is a map that stores key-value pairs (string values) in thread local storage.
|
||||||
// Each thread maintains its own MDC, which loggers use to append diagnostic information to log outputs.
|
// Each thread maintains its own MDC, which loggers use to append diagnostic information to log outputs.
|
||||||
// Note: it is not supported in asynchronous mode due to its reliance on thread-local storage.
|
// Note: it is not supported in asynchronous mode due to its reliance on thread-local storage.
|
||||||
#include "spdlog/mdc.h"
|
|
||||||
|
#ifndef SPDLOG_NO_TLS
|
||||||
|
#include "spdlog/mdc.h"
|
||||||
void mdc_example()
|
void mdc_example()
|
||||||
{
|
{
|
||||||
spdlog::mdc::put("key1", "value1");
|
spdlog::mdc::put("key1", "value1");
|
||||||
@ -391,3 +393,8 @@ void mdc_example()
|
|||||||
spdlog::set_pattern("[%H:%M:%S %z] [%^%L%$] [%&] %v");
|
spdlog::set_pattern("[%H:%M:%S %z] [%^%L%$] [%&] %v");
|
||||||
spdlog::info("Some log message with context");
|
spdlog::info("Some log message with context");
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
void mdc_example() {
|
||||||
|
// if TLS feature is disabled
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
@ -3,6 +3,10 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#if defined(SPDLOG_NO_TLS)
|
||||||
|
#error "This header requires thread local storage support. Please do not define SPDLOG_NO_TLS."
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
@ -10,7 +10,11 @@
|
|||||||
#include <spdlog/details/fmt_helper.h>
|
#include <spdlog/details/fmt_helper.h>
|
||||||
#include <spdlog/details/log_msg.h>
|
#include <spdlog/details/log_msg.h>
|
||||||
#include <spdlog/details/os.h>
|
#include <spdlog/details/os.h>
|
||||||
#include <spdlog/mdc.h>
|
|
||||||
|
#ifndef SPDLOG_NO_TLS
|
||||||
|
#include <spdlog/mdc.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <spdlog/fmt/fmt.h>
|
#include <spdlog/fmt/fmt.h>
|
||||||
#include <spdlog/formatter.h>
|
#include <spdlog/formatter.h>
|
||||||
|
|
||||||
@ -786,6 +790,7 @@ private:
|
|||||||
|
|
||||||
// Class for formatting Mapped Diagnostic Context (MDC) in log messages.
|
// Class for formatting Mapped Diagnostic Context (MDC) in log messages.
|
||||||
// Example: [logger-name] [info] [mdc_key_1:mdc_value_1 mdc_key_2:mdc_value_2] some message
|
// Example: [logger-name] [info] [mdc_key_1:mdc_value_1 mdc_key_2:mdc_value_2] some message
|
||||||
|
#ifndef SPDLOG_NO_TLS
|
||||||
template <typename ScopedPadder>
|
template <typename ScopedPadder>
|
||||||
class mdc_formatter : public flag_formatter {
|
class mdc_formatter : public flag_formatter {
|
||||||
public:
|
public:
|
||||||
@ -824,6 +829,7 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
// Full info formatter
|
// Full info formatter
|
||||||
// pattern: [%Y-%m-%d %H:%M:%S.%e] [%n] [%l] [%s:%#] %v
|
// pattern: [%Y-%m-%d %H:%M:%S.%e] [%n] [%l] [%s:%#] %v
|
||||||
@ -901,6 +907,7 @@ public:
|
|||||||
dest.push_back(' ');
|
dest.push_back(' ');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef SPDLOG_NO_TLS
|
||||||
// add mdc if present
|
// add mdc if present
|
||||||
auto &mdc_map = mdc::get_context();
|
auto &mdc_map = mdc::get_context();
|
||||||
if (!mdc_map.empty()) {
|
if (!mdc_map.empty()) {
|
||||||
@ -909,6 +916,7 @@ public:
|
|||||||
dest.push_back(']');
|
dest.push_back(']');
|
||||||
dest.push_back(' ');
|
dest.push_back(' ');
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
// fmt_helper::append_string_view(msg.msg(), dest);
|
// fmt_helper::append_string_view(msg.msg(), dest);
|
||||||
fmt_helper::append_string_view(msg.payload, dest);
|
fmt_helper::append_string_view(msg.payload, dest);
|
||||||
}
|
}
|
||||||
@ -916,7 +924,11 @@ public:
|
|||||||
private:
|
private:
|
||||||
std::chrono::seconds cache_timestamp_{0};
|
std::chrono::seconds cache_timestamp_{0};
|
||||||
memory_buf_t cached_datetime_;
|
memory_buf_t cached_datetime_;
|
||||||
|
|
||||||
|
#ifndef SPDLOG_NO_TLS
|
||||||
mdc_formatter<null_scoped_padder> mdc_formatter_{padding_info{}};
|
mdc_formatter<null_scoped_padder> mdc_formatter_{padding_info{}};
|
||||||
|
#endif
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace details
|
} // namespace details
|
||||||
@ -1211,9 +1223,11 @@ SPDLOG_INLINE void pattern_formatter::handle_flag_(char flag, details::padding_i
|
|||||||
padding));
|
padding));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#ifndef SPDLOG_NO_TLS // mdc formatter requires TLS support
|
||||||
case ('&'):
|
case ('&'):
|
||||||
formatters_.push_back(details::make_unique<details::mdc_formatter<Padder>>(padding));
|
formatters_.push_back(details::make_unique<details::mdc_formatter<Padder>>(padding));
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
default: // Unknown flag appears as is
|
default: // Unknown flag appears as is
|
||||||
auto unknown_flag = details::make_unique<details::aggregate_formatter>();
|
auto unknown_flag = details::make_unique<details::aggregate_formatter>();
|
||||||
|
@ -26,7 +26,11 @@
|
|||||||
#include "spdlog/spdlog.h"
|
#include "spdlog/spdlog.h"
|
||||||
#include "spdlog/async.h"
|
#include "spdlog/async.h"
|
||||||
#include "spdlog/details/fmt_helper.h"
|
#include "spdlog/details/fmt_helper.h"
|
||||||
#include "spdlog/mdc.h"
|
|
||||||
|
#ifndef SPDLOG_NO_TLS
|
||||||
|
#include "spdlog/mdc.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "spdlog/sinks/basic_file_sink.h"
|
#include "spdlog/sinks/basic_file_sink.h"
|
||||||
#include "spdlog/sinks/daily_file_sink.h"
|
#include "spdlog/sinks/daily_file_sink.h"
|
||||||
#include "spdlog/sinks/null_sink.h"
|
#include "spdlog/sinks/null_sink.h"
|
||||||
|
@ -501,6 +501,7 @@ TEST_CASE("override need_localtime", "[pattern_formatter]") {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef SPDLOG_NO_TLS
|
||||||
TEST_CASE("mdc formatter test-1", "[pattern_formatter]") {
|
TEST_CASE("mdc formatter test-1", "[pattern_formatter]") {
|
||||||
spdlog::mdc::put("mdc_key_1", "mdc_value_1");
|
spdlog::mdc::put("mdc_key_1", "mdc_value_1");
|
||||||
spdlog::mdc::put("mdc_key_2", "mdc_value_2");
|
spdlog::mdc::put("mdc_key_2", "mdc_value_2");
|
||||||
@ -628,3 +629,4 @@ TEST_CASE("mdc empty", "[pattern_formatter]") {
|
|||||||
|
|
||||||
SECTION("Tear down") { spdlog::mdc::clear(); }
|
SECTION("Tear down") { spdlog::mdc::clear(); }
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user