logging/backend: Move CreateEntry into the Impl class

This function is only ever used within this source file and makes it
easier to remove static state in the following change.
This commit is contained in:
Lioncash 2019-03-02 14:25:50 -05:00 committed by fearlessTobi
parent 29c3d72940
commit 235fc348af
2 changed files with 28 additions and 31 deletions

View File

@ -39,8 +39,10 @@ public:
Impl(Impl const&) = delete; Impl(Impl const&) = delete;
const Impl& operator=(Impl const&) = delete; const Impl& operator=(Impl const&) = delete;
void PushEntry(Entry e) { void PushEntry(Class log_class, Level log_level, const char* filename, unsigned int line_num,
message_queue.Push(std::move(e)); const char* function, std::string message) {
message_queue.Push(
CreateEntry(log_class, log_level, filename, line_num, function, std::move(message)));
} }
void AddBackend(std::unique_ptr<Backend> backend) { void AddBackend(std::unique_ptr<Backend> backend) {
@ -108,6 +110,28 @@ private:
backend_thread.join(); backend_thread.join();
} }
Entry CreateEntry(Class log_class, Level log_level, const char* filename, unsigned int line_nr,
const char* function, std::string message) const {
using std::chrono::duration_cast;
using std::chrono::steady_clock;
// matches from the beginning up to the last '../' or 'src/'
static const std::regex trim_source_path(R"(.*([\/\\]|^)((\.\.)|(src))[\/\\])");
static steady_clock::time_point time_origin = steady_clock::now();
Entry entry;
entry.timestamp =
duration_cast<std::chrono::microseconds>(steady_clock::now() - time_origin);
entry.log_class = log_class;
entry.log_level = log_level;
entry.filename = std::regex_replace(filename, trim_source_path, "");
entry.line_num = line_nr;
entry.function = function;
entry.message = std::move(message);
return entry;
}
std::mutex writing_mutex; std::mutex writing_mutex;
std::thread backend_thread; std::thread backend_thread;
std::vector<std::unique_ptr<Backend>> backends; std::vector<std::unique_ptr<Backend>> backends;
@ -249,27 +273,6 @@ const char* GetLevelName(Level log_level) {
#undef LVL #undef LVL
} }
Entry CreateEntry(Class log_class, Level log_level, const char* filename, unsigned int line_nr,
const char* function, std::string message) {
using std::chrono::duration_cast;
using std::chrono::steady_clock;
// matches from the beginning up to the last '../' or 'src/'
static const std::regex trim_source_path(R"(.*([\/\\]|^)((\.\.)|(src))[\/\\])");
static steady_clock::time_point time_origin = steady_clock::now();
Entry entry;
entry.timestamp = duration_cast<std::chrono::microseconds>(steady_clock::now() - time_origin);
entry.log_class = log_class;
entry.log_level = log_level;
entry.filename = std::regex_replace(filename, trim_source_path, "");
entry.line_num = line_nr;
entry.function = function;
entry.message = std::move(message);
return entry;
}
void SetGlobalFilter(const Filter& filter) { void SetGlobalFilter(const Filter& filter) {
Impl::Instance().SetGlobalFilter(filter); Impl::Instance().SetGlobalFilter(filter);
} }
@ -294,9 +297,7 @@ void FmtLogMessageImpl(Class log_class, Level log_level, const char* filename,
if (!filter.CheckMessage(log_class, log_level)) if (!filter.CheckMessage(log_class, log_level))
return; return;
Entry entry = instance.PushEntry(log_class, log_level, filename, line_num, function,
CreateEntry(log_class, log_level, filename, line_num, function, fmt::vformat(format, args)); fmt::vformat(format, args));
instance.PushEntry(std::move(entry));
} }
} // namespace Log } // namespace Log

View File

@ -136,10 +136,6 @@ const char* GetLogClassName(Class log_class);
*/ */
const char* GetLevelName(Level log_level); const char* GetLevelName(Level log_level);
/// Creates a log entry by formatting the given source location, and message.
Entry CreateEntry(Class log_class, Level log_level, const char* filename, unsigned int line_nr,
const char* function, std::string message);
/** /**
* The global filter will prevent any messages from even being processed if they are filtered. Each * The global filter will prevent any messages from even being processed if they are filtered. Each
* backend can have a filter, but if the level is lower than the global filter, the backend will * backend can have a filter, but if the level is lower than the global filter, the backend will