summaryrefslogtreecommitdiffstats
path: root/src/vpp-api/vom/logger.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/vpp-api/vom/logger.cpp')
-rw-r--r--src/vpp-api/vom/logger.cpp110
1 files changed, 89 insertions, 21 deletions
diff --git a/src/vpp-api/vom/logger.cpp b/src/vpp-api/vom/logger.cpp
index 07e27499b59..80f2d92c603 100644
--- a/src/vpp-api/vom/logger.cpp
+++ b/src/vpp-api/vom/logger.cpp
@@ -43,7 +43,7 @@ logger()
log_t::log_t()
: m_level(log_level_t::ERROR)
- , m_o_stream(&std::cout)
+ , m_handler(new cout_handler())
{
}
@@ -54,45 +54,113 @@ log_t::set(const log_level_t& level)
}
void
-log_t::set(const std::string& ofile)
+log_t::set(handler* h)
{
- m_file_stream.open(ofile);
- m_o_stream = &m_file_stream;
+ m_handler = h;
+}
+
+void
+log_t::write(const std::string& file,
+ const int line,
+ const std::string& function,
+ const log_level_t& level,
+ const std::string& message)
+{
+ m_handler->handle_message(file, line, function, level, message);
+}
+
+/**
+ * The configured level
+ */
+const log_level_t&
+log_t::level() const
+{
+ return (m_level);
+}
+
+static std::string
+get_filename(const std::string& file)
+{
+ std::vector<std::string> dirs;
+ boost::split(dirs, file, boost::is_any_of("/"));
+
+ return dirs.back();
+}
+
+log_t::entry::entry(const char* file,
+ const char* function,
+ int line,
+ const log_level_t& level)
+ : m_file(get_filename(file))
+ , m_function(function)
+ , m_level(level)
+ , m_line(line)
+{
+}
+
+log_t::entry::~entry()
+{
+ logger().write(m_file, m_line, m_function, m_level, m_stream.str());
+}
+
+std::stringstream&
+log_t::entry::stream()
+{
+ return (m_stream);
}
-std::ostream&
-log_t::stream(const char* file, int line, const log_level_t& level)
+static std::string
+get_timestamp()
{
auto end = std::chrono::system_clock::now();
auto end_time = std::chrono::system_clock::to_time_t(end);
/*
- * put-time is not support in gcc in 4.8
- * so we play this dance with ctime
- */
+ * put-time is not support in gcc in 4.8
+ * so we play this dance with ctime
+ */
std::string display = std::ctime(&end_time);
display.pop_back();
- std::vector<std::string> dirs;
- boost::split(dirs, file, boost::is_any_of("/"));
+ return (display);
+}
- *m_o_stream << std::endl
- << display << " [" << level.to_string() << "]"
- << " " << dirs.back() << ":" << line << ": ";
+file_handler::file_handler(const std::string& ofile)
+{
+ m_file_stream.open(ofile);
+}
- return (*m_o_stream);
+file_handler::~file_handler()
+{
+ m_file_stream.close();
}
-/**
- * The configured level
- */
-const log_level_t&
-log_t::level() const
+void
+file_handler::handle_message(const std::string& file,
+ const int line,
+ const std::string& function,
+ const log_level_t& level,
+ const std::string& message)
{
- return (m_level);
+ m_file_stream << get_timestamp();
+ m_file_stream << " [" << level.to_string() << "]" << file << ":" << line
+ << " " << function << "() " << message << std::endl;
}
+
+void
+cout_handler::handle_message(const std::string& file,
+ const int line,
+ const std::string& function,
+ const log_level_t& level,
+ const std::string& message)
+{
+ std::cout << get_timestamp();
+ std::cout << " [" << level.to_string() << "]" << file << ":" << line << " "
+ << function << "() " << message << std::endl;
}
+}; // namespace VOM
+
/*
* fd.io coding-style-patch-verification: ON
*