diff --git a/flow/ITrace.h b/flow/ITrace.h index 3af788ca85..667f352426 100644 --- a/flow/ITrace.h +++ b/flow/ITrace.h @@ -40,10 +40,10 @@ struct ITraceLogWriter { class TraceEventFields; struct ITraceLogFormatter { - virtual const char* getExtension() = 0; - virtual const char* getHeader() = 0; // Called when starting a new file - virtual const char* getFooter() = 0; // Called when ending a file - virtual std::string formatEvent(const TraceEventFields&) = 0; // Called for each event + virtual const char* getExtension() const = 0; + virtual const char* getHeader() const = 0; // Called when starting a new file + virtual const char* getFooter() const = 0; // Called when ending a file + virtual std::string formatEvent(const TraceEventFields&) const = 0; // Called for each event virtual void addref() = 0; virtual void delref() = 0; diff --git a/flow/JsonTraceLogFormatter.cpp b/flow/JsonTraceLogFormatter.cpp index 8574f35a80..2323d3d272 100644 --- a/flow/JsonTraceLogFormatter.cpp +++ b/flow/JsonTraceLogFormatter.cpp @@ -31,55 +31,55 @@ void JsonTraceLogFormatter::delref() { ReferenceCounted::delref(); } -const char* JsonTraceLogFormatter::getExtension() { +const char* JsonTraceLogFormatter::getExtension() const { return "json"; } -const char* JsonTraceLogFormatter::getHeader() { +const char* JsonTraceLogFormatter::getHeader() const { return ""; } -const char* JsonTraceLogFormatter::getFooter() { +const char* JsonTraceLogFormatter::getFooter() const { return ""; } namespace { -void escapeString(std::stringstream& ss, const std::string& source) { +void escapeString(std::ostringstream& oss, const std::string& source) { for (auto c : source) { if (c == '"') { - ss << "\\\""; + oss << "\\\""; } else if (c == '\\') { - ss << "\\\\"; + oss << "\\\\"; } else if (c == '\n') { - ss << "\\n"; + oss << "\\n"; } else if (c == '\r') { - ss << "\\r"; + oss << "\\r"; } else if (isprint(c)) { - ss << c; + oss << c; } else { constexpr char hex[] = "0123456789abcdef"; int x = int{ static_cast(c) }; - ss << "\\x" << hex[x / 16] << hex[x % 16]; + oss << "\\x" << hex[x / 16] << hex[x % 16]; } } } } // namespace -std::string JsonTraceLogFormatter::formatEvent(const TraceEventFields& fields) { - std::stringstream ss; - ss << "{ "; +std::string JsonTraceLogFormatter::formatEvent(const TraceEventFields& fields) const { + std::ostringstream oss; + oss << "{ "; for (auto iter = fields.begin(); iter != fields.end(); ++iter) { if (iter != fields.begin()) { - ss << ", "; + oss << ", "; } - ss << "\""; - escapeString(ss, iter->first); - ss << "\": \""; - escapeString(ss, iter->second); - ss << "\""; + oss << "\""; + escapeString(oss, iter->first); + oss << "\": \""; + escapeString(oss, iter->second); + oss << "\""; } - ss << " }\r\n"; - return ss.str(); + oss << " }\r\n"; + return std::move(oss).str(); } diff --git a/flow/JsonTraceLogFormatter.h b/flow/JsonTraceLogFormatter.h index 246ba0f455..38e4e4f8f0 100644 --- a/flow/JsonTraceLogFormatter.h +++ b/flow/JsonTraceLogFormatter.h @@ -22,10 +22,10 @@ #include "flow/Trace.h" struct JsonTraceLogFormatter final : public ITraceLogFormatter, ReferenceCounted { - const char* getExtension() override; - const char* getHeader() override; // Called when starting a new file - const char* getFooter() override; // Called when ending a file - std::string formatEvent(const TraceEventFields&) override; // Called for each event + const char* getExtension() const override; + const char* getHeader() const override; // Called when starting a new file + const char* getFooter() const override; // Called when ending a file + std::string formatEvent(const TraceEventFields&) const override; // Called for each event void addref() override; void delref() override; diff --git a/flow/XmlTraceLogFormatter.cpp b/flow/XmlTraceLogFormatter.cpp index 4229c3b0db..dff1ca15ab 100644 --- a/flow/XmlTraceLogFormatter.cpp +++ b/flow/XmlTraceLogFormatter.cpp @@ -30,38 +30,38 @@ void XmlTraceLogFormatter::delref() { ReferenceCounted::delref(); } -const char* XmlTraceLogFormatter::getExtension() { +const char* XmlTraceLogFormatter::getExtension() const { return "xml"; } -const char* XmlTraceLogFormatter::getHeader() { +const char* XmlTraceLogFormatter::getHeader() const { return "\r\n\r\n"; } -const char* XmlTraceLogFormatter::getFooter() { +const char* XmlTraceLogFormatter::getFooter() const { return "\r\n"; } -void XmlTraceLogFormatter::escape(std::stringstream& ss, std::string source) { +void XmlTraceLogFormatter::escape(std::ostringstream& oss, std::string source) const { loop { int index = source.find_first_of(std::string({ '&', '"', '<', '>', '\r', '\n', '\0' })); if (index == source.npos) { break; } - ss << source.substr(0, index); + oss << source.substr(0, index); if (source[index] == '&') { - ss << "&"; + oss << "&"; } else if (source[index] == '"') { - ss << """; + oss << """; } else if (source[index] == '<') { - ss << "<"; + oss << "<"; } else if (source[index] == '>') { - ss << ">"; + oss << ">"; } else if (source[index] == '\n' || source[index] == '\r') { - ss << " "; + oss << " "; } else if (source[index] == '\0') { - ss << " "; + oss << " "; TraceEvent(SevWarnAlways, "StrippedIllegalCharacterFromTraceEvent") .detail("Source", StringRef(source).printable()) .detail("Character", StringRef(source.substr(index, 1)).printable()); @@ -72,20 +72,20 @@ void XmlTraceLogFormatter::escape(std::stringstream& ss, std::string source) { source = source.substr(index + 1); } - ss << source; + oss << std::move(source); } -std::string XmlTraceLogFormatter::formatEvent(const TraceEventFields& fields) { - std::stringstream ss; - ss << "\r\n"; - return ss.str(); + oss << "/>\r\n"; + return std::move(oss).str(); } diff --git a/flow/XmlTraceLogFormatter.h b/flow/XmlTraceLogFormatter.h index 3d2444b583..502dcaa5e4 100644 --- a/flow/XmlTraceLogFormatter.h +++ b/flow/XmlTraceLogFormatter.h @@ -31,12 +31,12 @@ struct XmlTraceLogFormatter final : public ITraceLogFormatter, ReferenceCounted< void addref() override; void delref() override; - const char* getExtension() override; - const char* getHeader() override; - const char* getFooter() override; + const char* getExtension() const override; + const char* getHeader() const override; + const char* getFooter() const override; - void escape(std::stringstream& ss, std::string source); - std::string formatEvent(const TraceEventFields& fields) override; + void escape(std::ostringstream& oss, std::string source) const; + std::string formatEvent(const TraceEventFields& fields) const override; }; #endif