1717 * under the License.
1818 */
1919
20- #include " iceberg/logging/internal/spdlog_logger .h"
20+ #include " iceberg/logging/spdlog_logger_internal .h"
2121
2222#ifdef ICEBERG_HAS_SPDLOG
2323
2424# include < memory>
2525# include < string>
2626# include < unordered_map>
27- # include < utility>
2827
2928# include < spdlog/common.h>
3029# include < spdlog/sinks/stdout_color_sinks.h>
@@ -47,65 +46,46 @@ spdlog::level::level_enum ToSpdLevel(LogLevel level) noexcept {
4746 return spdlog::level::err;
4847 case LogLevel::kCritical :
4948 case LogLevel::kFatal :
50- // spdlog has no " fatal" ; the process abort is owned by the macro layer.
49+ // spdlog has no fatal level ; the macro layer handles termination .
5150 return spdlog::level::critical;
5251 case LogLevel::kOff :
5352 return spdlog::level::off;
5453 }
5554 return spdlog::level::off;
5655}
5756
58- // / \brief The built-in sink: a color stderr spdlog logger.
59- std::shared_ptr<spdlog::logger> MakeDefaultSpdLogger () {
60- return std::make_shared<spdlog::logger>(
61- " iceberg" , std::make_shared<spdlog::sinks::stderr_color_sink_mt>());
62- }
63-
6457} // namespace
6558
66- SpdLogger::SpdLogger (LogLevel level) : SpdLogger(MakeDefaultSpdLogger(), level) {}
59+ SpdLogger::SpdLogger (LogLevel level)
60+ : logger_(" iceberg" , std::make_shared<spdlog::sinks::stderr_color_sink_mt>()),
61+ level_ (level) {
62+ logger_.set_level (spdlog::level::trace);
63+ }
6764
6865Status SpdLogger::Initialize (
6966 const std::unordered_map<std::string, std::string>& properties) {
7067 if (auto it = properties.find (std::string (kPatternProperty )); it != properties.end ()) {
71- logger_-> set_pattern (it->second );
68+ logger_. set_pattern (it->second );
7269 }
73- // Apply "level" via the base implementation.
7470 return Logger::Initialize (properties);
7571}
7672
77- SpdLogger::SpdLogger (std::shared_ptr<spdlog::logger> logger, LogLevel level)
78- : logger_(std::move(logger)), level_(level) {
79- // logger_ is non-null for the rest of this object's life, so Initialize/Log/Flush
80- // may dereference it unconditionally. Enforced by substitution rather than an
81- // assertion, which would vanish under NDEBUG and leave a release-build crash: a
82- // null argument falls back to the same stderr-backed logger the default
83- // constructor builds, so a caller mistake degrades to the default sink.
84- if (!logger_) {
85- logger_ = MakeDefaultSpdLogger ();
86- }
87- logger_->set_level (spdlog::level::trace); // filtering is done by ShouldLog
88- }
89-
9073void SpdLogger::Log (LogMessage&& message) noexcept {
9174 try {
9275 spdlog::source_loc loc{message.location .file_name (),
9376 static_cast <int >(message.location .line ()),
9477 message.location .function_name ()};
95- // Raw-message overload: the text is already formatted, so hand spdlog the bytes
96- // directly instead of running them back through fmt (which would re-parse and
97- // copy the whole message, allocating for long ones). It also means braces in the
98- // message can never be interpreted as format placeholders.
99- logger_->log (loc, ToSpdLevel (message.level ),
100- spdlog::string_view_t {message.message .data (), message.message .size ()});
78+ // LogMessage is already formatted; use spdlog's raw-message overload.
79+ logger_.log (loc, ToSpdLevel (message.level ),
80+ spdlog::string_view_t {message.message .data (), message.message .size ()});
10181 } catch (...) {
10282 // Logging must never throw.
10383 }
10484}
10585
10686void SpdLogger::Flush () noexcept {
10787 try {
108- logger_-> flush ();
88+ logger_. flush ();
10989 } catch (...) {
11090 }
11191}
0 commit comments