#pragma once #include #include #include namespace plog { class CsvFormatter { public: static util::nstring header() { return PLOG_NSTR("Date;Time;Severity;TID;This;Function;Message\n"); } static util::nstring format(const Record& record) { tm t; util::localtime_s(&t, &record.getTime().time); util::nstringstream ss; ss << t.tm_year + 1900 << PLOG_NSTR("/") << std::setfill(PLOG_NSTR('0')) << std::setw(2) << t.tm_mon + 1 << PLOG_NSTR("/") << std::setfill(PLOG_NSTR('0')) << std::setw(2) << t.tm_mday << PLOG_NSTR(";"); ss << std::setfill(PLOG_NSTR('0')) << std::setw(2) << t.tm_hour << PLOG_NSTR(":") << std::setfill(PLOG_NSTR('0')) << std::setw(2) << t.tm_min << PLOG_NSTR(":") << std::setfill(PLOG_NSTR('0')) << std::setw(2) << t.tm_sec << PLOG_NSTR(".") << std::setfill(PLOG_NSTR('0')) << std::setw(3) << record.getTime().millitm << PLOG_NSTR(";"); ss << severityToString(record.getSeverity()) << PLOG_NSTR(";"); ss << record.getTid() << PLOG_NSTR(";"); ss << record.getObject() << PLOG_NSTR(";"); ss << record.getFunc() << PLOG_NSTR("@") << record.getLine() << PLOG_NSTR(";"); util::nstring message = record.getMessage(); if (message.size() > kMaxMessageSize) { message.resize(kMaxMessageSize); message.append(PLOG_NSTR("...")); } util::nstringstream split(message); util::nstring token; while (!split.eof()) { std::getline(split, token, PLOG_NSTR('"')); ss << PLOG_NSTR("\"") << token << PLOG_NSTR("\""); } ss << PLOG_NSTR("\n"); return ss.str(); } static const size_t kMaxMessageSize = 32000; }; }