diff --git a/.gitignore b/.gitignore index 253e16b..6e95f64 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ out/ build/ .cache/ compile_commands.json +.gdb_history diff --git a/CMakeLists.txt b/CMakeLists.txt index 981d316..5393138 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -167,7 +167,7 @@ set(TILE_SRCS "tile/base/internal/thread_pool.cc" "tile/base/internal/time_keeper.cc" "tile/base/internal/time_keeper.h" - # logging + "tile/base/logging/basic_file_sink.cc" "tile/base/logging/splitter_sink.cc" "tile/base/logging/console_sink.cc" "tile/base/net/endpoint.cc" diff --git a/tile/base/internal/logging.cc b/tile/base/internal/logging.cc index 21c00d2..2e81ab9 100644 --- a/tile/base/internal/logging.cc +++ b/tile/base/internal/logging.cc @@ -99,7 +99,7 @@ public: ++g_num_messages[severity_]; WaitForSinks(); if (sink_) { - sink_->WaitTillSent(); + sink_->Flush(); } } @@ -141,7 +141,7 @@ private: void SendToSink() { if (sink_) { - sink_->send(severity_, fullname(), basename(), line(), time(), + sink_->Send(severity_, fullname(), basename(), line(), time(), message_text_ + num_prefix_chars_, num_chars_to_log_ - num_prefix_chars_ - 1); } @@ -278,14 +278,15 @@ void LogMessageTime::CalcGmtOffset() { } LogSink::~LogSink() {} -void LogSink::send(LogSeverity severity, const char *full_filename, +bool LogSink::ShouldLog(LogSeverity severity) { return true; } +void LogSink::Send(LogSeverity severity, const char *full_filename, const char *base_filename, int line, const LogMessageTime &logmsgtime, const char *message, size_t message_len) { // do nothing } -void LogSink::WaitTillSent() {} +void LogSink::Flush() {} std::string LogSink::ToString(LogSeverity severity, const char *file, const char *base_filename, int line, @@ -356,14 +357,16 @@ void LogToSinks(LogSeverity severity, const char *full_filename, const char *message, size_t message_len) { std::lock_guard _(g_sink_mutex); for (auto &&sink : g_sinks) { - sink->send(severity, full_filename, base_filename, line, time, message, - message_len); + if (sink->ShouldLog(severity)) { + sink->Send(severity, full_filename, base_filename, line, time, message, + message_len); + } } } void WaitForSinks() { std::lock_guard _(g_sink_mutex); for (auto &&sink : g_sinks) { - sink->WaitTillSent(); + sink->Flush(); } } diff --git a/tile/base/internal/logging.h b/tile/base/internal/logging.h index 92900f2..e39c94f 100644 --- a/tile/base/internal/logging.h +++ b/tile/base/internal/logging.h @@ -700,16 +700,15 @@ public: using Ptr = std::shared_ptr; virtual ~LogSink(); - virtual void send(LogSeverity severity, const char *full_filename, + virtual bool ShouldLog(LogSeverity severity); + virtual void Send(LogSeverity severity, const char *full_filename, const char *base_filename, int line, const LogMessageTime &logmsgtime, const char *message, size_t message_len); - virtual void WaitTillSent(); - - virtual std::string ToString(LogSeverity severity, const char *file, - const char *base_filename, int line, - const LogMessageTime &logmsgtime, - const char *message, size_t message_len); + virtual void Flush(); + std::string ToString(LogSeverity severity, const char *file, int line, + const LogMessageTime &logmsgtime, const char *message, + size_t message_len); }; void ColoredWriteToStdout(LogSeverity severity, const char *message, diff --git a/tile/base/internal/logging_test.cc b/tile/base/internal/logging_test.cc index 6d94cf9..878baae 100644 --- a/tile/base/internal/logging_test.cc +++ b/tile/base/internal/logging_test.cc @@ -9,7 +9,7 @@ #include struct AwesomeLogSink : public tile::LogSink { - virtual void send(tile::LogSeverity severity, const char *full_filename, + virtual void Send(tile::LogSeverity severity, const char *full_filename, const char *base_filename, int line, const tile::LogMessageTime &logmsgtime, const char *message, size_t message_len) override { diff --git a/tile/base/internal/sinks/splitter_sink.h b/tile/base/internal/sinks/splitter_sink.h deleted file mode 100644 index e69de29..0000000 diff --git a/tile/base/logging/basic_file_sink.cc b/tile/base/logging/basic_file_sink.cc new file mode 100644 index 0000000..938e1fa --- /dev/null +++ b/tile/base/logging/basic_file_sink.cc @@ -0,0 +1,19 @@ +#include "tile/base/logging/basic_file_sink.h" + +namespace tile { +BasicFileSink::BasicFileSink() {} +BasicFileSink::~BasicFileSink() {} +void BasicFileSink::Send(LogSeverity severity, const char *full_filename, + const char *base_filename, int line, + const LogMessageTime &logmsgtime, const char *message, + size_t message_len) { + TILE_CHECK(!filepath_.empty(), "filepath is empty"); + ofs_ << message << std::endl; +} +std::string BasicFileSink::filepath() const { return filepath_; } +void BasicFileSink::set_filepath(const std::string &filepath) { + filepath_ = filepath; + ofs_.open(filepath, std::ios::out | std::ios::app); +} +void BasicFileSink::Flush() { ofs_.flush(); } +} // namespace tile diff --git a/tile/base/logging/basic_file_sink.h b/tile/base/logging/basic_file_sink.h new file mode 100644 index 0000000..db7d76b --- /dev/null +++ b/tile/base/logging/basic_file_sink.h @@ -0,0 +1,31 @@ +#ifndef TILE_BASE_LOGGING_BASIC_FILE_SINK_H +#define TILE_BASE_LOGGING_BASIC_FILE_SINK_H + +#pragma once +#include "tile/base/internal/logging.h" + +#include +#include + +namespace tile { +class BasicFileSink : public LogSink { +public: + BasicFileSink(); + ~BasicFileSink() override; + void Send(LogSeverity severity, const char *full_filename, + const char *base_filename, int line, + const LogMessageTime &logmsgtime, const char *message, + size_t message_len) override; + void Flush() override; + + std::string filepath() const; + void set_filepath(const std::string &filepath); + +private: + std::string filepath_; + std::ofstream ofs_; +}; + +} // namespace tile + +#endif // TILE_BASE_LOGGING_BASIC_FILE_SINK_H diff --git a/tile/base/logging/splitter_sink.cc b/tile/base/logging/splitter_sink.cc index a2f54a1..e658d94 100644 --- a/tile/base/logging/splitter_sink.cc +++ b/tile/base/logging/splitter_sink.cc @@ -17,7 +17,7 @@ std::shared_ptr SplitterSink::Create( SplitterSink::SplitterSink() {} SplitterSink::~SplitterSink() {} -void SplitterSink::send(LogSeverity severity, const char *full_filename, +void SplitterSink::Send(LogSeverity severity, const char *full_filename, const char *base_filename, int line, const LogMessageTime &logmsgtime, const char *message, size_t message_len) { @@ -25,18 +25,18 @@ void SplitterSink::send(LogSeverity severity, const char *full_filename, std::lock_guard _(sinks_mutex_); doing_ = true; for (auto &sink : sinks_) { - sink->send(severity, full_filename, base_filename, line, logmsgtime, + sink->Send(severity, full_filename, base_filename, line, logmsgtime, message, message_len); } doing_ = false; } -void SplitterSink::WaitTillSent() { +void SplitterSink::Flush() { assert(!doing_ && "SplitterSink::send() should not be called recursively"); std::lock_guard _(sinks_mutex_); doing_ = true; for (auto &sink : sinks_) { - sink->WaitTillSent(); + sink->Flush(); } doing_ = false; } diff --git a/tile/base/logging/splitter_sink.h b/tile/base/logging/splitter_sink.h index aae5640..082c29a 100644 --- a/tile/base/logging/splitter_sink.h +++ b/tile/base/logging/splitter_sink.h @@ -1,3 +1,7 @@ +#ifndef TILE_BASE_LOGGING_SPLITTER_SINK_H +#define TILE_BASE_LOGGING_SPLITTER_SINK_H + +#pragma once #include "tile/base/internal/logging.h" #include @@ -12,11 +16,11 @@ public: ~SplitterSink() override; - void send(LogSeverity severity, const char *full_filename, + void Send(LogSeverity severity, const char *full_filename, const char *base_filename, int line, const LogMessageTime &logmsgtime, const char *message, size_t message_len) override; - void WaitTillSent() override; + void Flush() override; void AddSink(std::shared_ptr sink); void RemoveSink(std::shared_ptr sink); @@ -32,3 +36,5 @@ private: bool doing_ = false; }; } // namespace tile + +#endif // TILE_BASE_LOGGING_SPLITTER_SINK_H