1515
1616namespace log_utils {
1717
18+
19+ // The custom formatter that allows:
20+ // to output unformatted messages for the logger with "raw" name
21+ // to output messages for the logger with "qt" name for message from Qt loggers
22+ // to output messages for all other loggers with standard json pattern
23+
24+ class CustomFormatter : public spdlog ::formatter {
25+ public:
26+
27+ explicit CustomFormatter (std::unique_ptr<spdlog::formatter> formatter)
28+ {
29+ formatter_ = std::move (formatter);
30+ jsonFormatter_ = log_utils::createJsonFormatter ();
31+ }
32+
33+ virtual ~CustomFormatter () = default ;
34+
35+ void format (const spdlog::details::log_msg &msg, spdlog::memory_buf_t &dest) override
36+ {
37+ if (msg.logger_name == " raw" ) {
38+ dest.append (msg.payload .data (), msg.payload .data () + msg.payload .size ());
39+ } else if (msg.logger_name == " qt" ) {
40+ formatter_->format (msg, dest);
41+ } else {
42+ jsonFormatter_->format (msg, dest);
43+ }
44+ }
45+
46+ std::unique_ptr<formatter> clone () const override
47+ {
48+ return spdlog::details::make_unique<CustomFormatter>(formatter_->clone ());
49+ }
50+
51+ private:
52+ std::unique_ptr<spdlog::formatter> formatter_;
53+ std::unique_ptr<spdlog::formatter> jsonFormatter_;
54+ };
55+
56+
1857bool Logger::install (const QString &logFilePath, bool consoleOutput)
1958{
2059 QLoggingCategory::setFilterRules (" qt.tlsbackend.ossl=false\n qt.network.ssl=false" );
@@ -38,7 +77,7 @@ bool Logger::install(const QString &logFilePath, bool consoleOutput)
3877 // Create rotation logger with 2 file with unlimited size
3978 // rotate it on open, the first file is the current log, the 2nd is the previous log
4079 auto fileSink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(path, SIZE_MAX, 1 , true );
41- auto defaultLogger = std::make_shared<spdlog::logger>(" default " , fileSink);
80+ auto defaultLogger = std::make_shared<spdlog::logger>(" qt " , fileSink);
4281 spdlog::set_default_logger (defaultLogger);
4382
4483 // Create the logger without formatting for logging output from libraries such as wsnet, which format logs themselves
@@ -96,16 +135,17 @@ void Logger::myMessageHandler(QtMsgType type, const QMessageLogContext &context,
96135 // ::OutputDebugString(qUtf16Printable(s));
97136#endif
98137
138+ auto qtLogger = spdlog::get (" qt" );
99139 std::string escapedMsg = log_utils::escape_string (s.toStdString ());
100140 static const std::string fmt = " \" mod\" : \" {}\" , \" msg\" : \" {}\" " ;
101141 if (type == QtDebugMsg)
102- spdlog:: debug (fmt, context.category , escapedMsg);
142+ qtLogger-> debug (fmt, context.category , escapedMsg);
103143 else if (type == QtWarningMsg)
104- spdlog:: warn (fmt, context.category , escapedMsg);
144+ qtLogger-> warn (fmt, context.category , escapedMsg);
105145 else if (type == QtInfoMsg)
106- spdlog:: info (fmt, context.category , escapedMsg);
146+ qtLogger-> info (fmt, context.category , escapedMsg);
107147 else
108- spdlog:: error (fmt, context.category , escapedMsg);
148+ qtLogger-> error (fmt, context.category , escapedMsg);
109149}
110150
111151void Logger::startConnectionMode (const std::string &id)
@@ -136,10 +176,8 @@ spdlog::logger *Logger::getSpdLogger(const std::string &category)
136176{
137177 auto it = spd_loggers_.find (category);
138178 if (it == spd_loggers_.end ()) {
139- auto formatter = log_utils::createJsonFormatter ();
140179 auto sinks = spdlog::default_logger ()->sinks ();
141180 auto logger = std::make_shared<spdlog::logger>(category, sinks.begin (), sinks.end ());
142- logger->set_formatter (std::move (formatter));
143181 spd_loggers_[category] = logger;
144182 return logger.get ();
145183 } else {
0 commit comments