mirror of
https://github.com/apple/foundationdb.git
synced 2025-05-14 01:42:37 +08:00
Improve const-correctness of ITraceLogFormatter
This commit is contained in:
parent
c615279807
commit
63b241c60b
@ -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;
|
||||
|
@ -31,55 +31,55 @@ void JsonTraceLogFormatter::delref() {
|
||||
ReferenceCounted<JsonTraceLogFormatter>::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<uint8_t>(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();
|
||||
}
|
||||
|
@ -22,10 +22,10 @@
|
||||
#include "flow/Trace.h"
|
||||
|
||||
struct JsonTraceLogFormatter final : public ITraceLogFormatter, ReferenceCounted<JsonTraceLogFormatter> {
|
||||
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;
|
||||
|
@ -30,38 +30,38 @@ void XmlTraceLogFormatter::delref() {
|
||||
ReferenceCounted<XmlTraceLogFormatter>::delref();
|
||||
}
|
||||
|
||||
const char* XmlTraceLogFormatter::getExtension() {
|
||||
const char* XmlTraceLogFormatter::getExtension() const {
|
||||
return "xml";
|
||||
}
|
||||
|
||||
const char* XmlTraceLogFormatter::getHeader() {
|
||||
const char* XmlTraceLogFormatter::getHeader() const {
|
||||
return "<?xml version=\"1.0\"?>\r\n<Trace>\r\n";
|
||||
}
|
||||
|
||||
const char* XmlTraceLogFormatter::getFooter() {
|
||||
const char* XmlTraceLogFormatter::getFooter() const {
|
||||
return "</Trace>\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 << "<Event ";
|
||||
std::string XmlTraceLogFormatter::formatEvent(const TraceEventFields& fields) const {
|
||||
std::ostringstream oss;
|
||||
oss << "<Event ";
|
||||
|
||||
for (auto itr : fields) {
|
||||
escape(ss, itr.first);
|
||||
ss << "=\"";
|
||||
escape(ss, itr.second);
|
||||
ss << "\" ";
|
||||
escape(oss, itr.first);
|
||||
oss << "=\"";
|
||||
escape(oss, itr.second);
|
||||
oss << "\" ";
|
||||
}
|
||||
|
||||
ss << "/>\r\n";
|
||||
return ss.str();
|
||||
oss << "/>\r\n";
|
||||
return std::move(oss).str();
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user