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;
|
class TraceEventFields;
|
||||||
|
|
||||||
struct ITraceLogFormatter {
|
struct ITraceLogFormatter {
|
||||||
virtual const char* getExtension() = 0;
|
virtual const char* getExtension() const = 0;
|
||||||
virtual const char* getHeader() = 0; // Called when starting a new file
|
virtual const char* getHeader() const = 0; // Called when starting a new file
|
||||||
virtual const char* getFooter() = 0; // Called when ending a file
|
virtual const char* getFooter() const = 0; // Called when ending a file
|
||||||
virtual std::string formatEvent(const TraceEventFields&) = 0; // Called for each event
|
virtual std::string formatEvent(const TraceEventFields&) const = 0; // Called for each event
|
||||||
|
|
||||||
virtual void addref() = 0;
|
virtual void addref() = 0;
|
||||||
virtual void delref() = 0;
|
virtual void delref() = 0;
|
||||||
|
@ -31,55 +31,55 @@ void JsonTraceLogFormatter::delref() {
|
|||||||
ReferenceCounted<JsonTraceLogFormatter>::delref();
|
ReferenceCounted<JsonTraceLogFormatter>::delref();
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* JsonTraceLogFormatter::getExtension() {
|
const char* JsonTraceLogFormatter::getExtension() const {
|
||||||
return "json";
|
return "json";
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* JsonTraceLogFormatter::getHeader() {
|
const char* JsonTraceLogFormatter::getHeader() const {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* JsonTraceLogFormatter::getFooter() {
|
const char* JsonTraceLogFormatter::getFooter() const {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
void escapeString(std::stringstream& ss, const std::string& source) {
|
void escapeString(std::ostringstream& oss, const std::string& source) {
|
||||||
for (auto c : source) {
|
for (auto c : source) {
|
||||||
if (c == '"') {
|
if (c == '"') {
|
||||||
ss << "\\\"";
|
oss << "\\\"";
|
||||||
} else if (c == '\\') {
|
} else if (c == '\\') {
|
||||||
ss << "\\\\";
|
oss << "\\\\";
|
||||||
} else if (c == '\n') {
|
} else if (c == '\n') {
|
||||||
ss << "\\n";
|
oss << "\\n";
|
||||||
} else if (c == '\r') {
|
} else if (c == '\r') {
|
||||||
ss << "\\r";
|
oss << "\\r";
|
||||||
} else if (isprint(c)) {
|
} else if (isprint(c)) {
|
||||||
ss << c;
|
oss << c;
|
||||||
} else {
|
} else {
|
||||||
constexpr char hex[] = "0123456789abcdef";
|
constexpr char hex[] = "0123456789abcdef";
|
||||||
int x = int{ static_cast<uint8_t>(c) };
|
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
|
} // namespace
|
||||||
|
|
||||||
std::string JsonTraceLogFormatter::formatEvent(const TraceEventFields& fields) {
|
std::string JsonTraceLogFormatter::formatEvent(const TraceEventFields& fields) const {
|
||||||
std::stringstream ss;
|
std::ostringstream oss;
|
||||||
ss << "{ ";
|
oss << "{ ";
|
||||||
for (auto iter = fields.begin(); iter != fields.end(); ++iter) {
|
for (auto iter = fields.begin(); iter != fields.end(); ++iter) {
|
||||||
if (iter != fields.begin()) {
|
if (iter != fields.begin()) {
|
||||||
ss << ", ";
|
oss << ", ";
|
||||||
}
|
}
|
||||||
ss << "\"";
|
oss << "\"";
|
||||||
escapeString(ss, iter->first);
|
escapeString(oss, iter->first);
|
||||||
ss << "\": \"";
|
oss << "\": \"";
|
||||||
escapeString(ss, iter->second);
|
escapeString(oss, iter->second);
|
||||||
ss << "\"";
|
oss << "\"";
|
||||||
}
|
}
|
||||||
ss << " }\r\n";
|
oss << " }\r\n";
|
||||||
return ss.str();
|
return std::move(oss).str();
|
||||||
}
|
}
|
||||||
|
@ -22,10 +22,10 @@
|
|||||||
#include "flow/Trace.h"
|
#include "flow/Trace.h"
|
||||||
|
|
||||||
struct JsonTraceLogFormatter final : public ITraceLogFormatter, ReferenceCounted<JsonTraceLogFormatter> {
|
struct JsonTraceLogFormatter final : public ITraceLogFormatter, ReferenceCounted<JsonTraceLogFormatter> {
|
||||||
const char* getExtension() override;
|
const char* getExtension() const override;
|
||||||
const char* getHeader() override; // Called when starting a new file
|
const char* getHeader() const override; // Called when starting a new file
|
||||||
const char* getFooter() override; // Called when ending a file
|
const char* getFooter() const override; // Called when ending a file
|
||||||
std::string formatEvent(const TraceEventFields&) override; // Called for each event
|
std::string formatEvent(const TraceEventFields&) const override; // Called for each event
|
||||||
|
|
||||||
void addref() override;
|
void addref() override;
|
||||||
void delref() override;
|
void delref() override;
|
||||||
|
@ -30,38 +30,38 @@ void XmlTraceLogFormatter::delref() {
|
|||||||
ReferenceCounted<XmlTraceLogFormatter>::delref();
|
ReferenceCounted<XmlTraceLogFormatter>::delref();
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* XmlTraceLogFormatter::getExtension() {
|
const char* XmlTraceLogFormatter::getExtension() const {
|
||||||
return "xml";
|
return "xml";
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* XmlTraceLogFormatter::getHeader() {
|
const char* XmlTraceLogFormatter::getHeader() const {
|
||||||
return "<?xml version=\"1.0\"?>\r\n<Trace>\r\n";
|
return "<?xml version=\"1.0\"?>\r\n<Trace>\r\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* XmlTraceLogFormatter::getFooter() {
|
const char* XmlTraceLogFormatter::getFooter() const {
|
||||||
return "</Trace>\r\n";
|
return "</Trace>\r\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
void XmlTraceLogFormatter::escape(std::stringstream& ss, std::string source) {
|
void XmlTraceLogFormatter::escape(std::ostringstream& oss, std::string source) const {
|
||||||
loop {
|
loop {
|
||||||
int index = source.find_first_of(std::string({ '&', '"', '<', '>', '\r', '\n', '\0' }));
|
int index = source.find_first_of(std::string({ '&', '"', '<', '>', '\r', '\n', '\0' }));
|
||||||
if (index == source.npos) {
|
if (index == source.npos) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ss << source.substr(0, index);
|
oss << source.substr(0, index);
|
||||||
if (source[index] == '&') {
|
if (source[index] == '&') {
|
||||||
ss << "&";
|
oss << "&";
|
||||||
} else if (source[index] == '"') {
|
} else if (source[index] == '"') {
|
||||||
ss << """;
|
oss << """;
|
||||||
} else if (source[index] == '<') {
|
} else if (source[index] == '<') {
|
||||||
ss << "<";
|
oss << "<";
|
||||||
} else if (source[index] == '>') {
|
} else if (source[index] == '>') {
|
||||||
ss << ">";
|
oss << ">";
|
||||||
} else if (source[index] == '\n' || source[index] == '\r') {
|
} else if (source[index] == '\n' || source[index] == '\r') {
|
||||||
ss << " ";
|
oss << " ";
|
||||||
} else if (source[index] == '\0') {
|
} else if (source[index] == '\0') {
|
||||||
ss << " ";
|
oss << " ";
|
||||||
TraceEvent(SevWarnAlways, "StrippedIllegalCharacterFromTraceEvent")
|
TraceEvent(SevWarnAlways, "StrippedIllegalCharacterFromTraceEvent")
|
||||||
.detail("Source", StringRef(source).printable())
|
.detail("Source", StringRef(source).printable())
|
||||||
.detail("Character", StringRef(source.substr(index, 1)).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);
|
source = source.substr(index + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
ss << source;
|
oss << std::move(source);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string XmlTraceLogFormatter::formatEvent(const TraceEventFields& fields) {
|
std::string XmlTraceLogFormatter::formatEvent(const TraceEventFields& fields) const {
|
||||||
std::stringstream ss;
|
std::ostringstream oss;
|
||||||
ss << "<Event ";
|
oss << "<Event ";
|
||||||
|
|
||||||
for (auto itr : fields) {
|
for (auto itr : fields) {
|
||||||
escape(ss, itr.first);
|
escape(oss, itr.first);
|
||||||
ss << "=\"";
|
oss << "=\"";
|
||||||
escape(ss, itr.second);
|
escape(oss, itr.second);
|
||||||
ss << "\" ";
|
oss << "\" ";
|
||||||
}
|
}
|
||||||
|
|
||||||
ss << "/>\r\n";
|
oss << "/>\r\n";
|
||||||
return ss.str();
|
return std::move(oss).str();
|
||||||
}
|
}
|
||||||
|
@ -31,12 +31,12 @@ struct XmlTraceLogFormatter final : public ITraceLogFormatter, ReferenceCounted<
|
|||||||
void addref() override;
|
void addref() override;
|
||||||
void delref() override;
|
void delref() override;
|
||||||
|
|
||||||
const char* getExtension() override;
|
const char* getExtension() const override;
|
||||||
const char* getHeader() override;
|
const char* getHeader() const override;
|
||||||
const char* getFooter() override;
|
const char* getFooter() const override;
|
||||||
|
|
||||||
void escape(std::stringstream& ss, std::string source);
|
void escape(std::ostringstream& oss, std::string source) const;
|
||||||
std::string formatEvent(const TraceEventFields& fields) override;
|
std::string formatEvent(const TraceEventFields& fields) const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user