فهرست منبع

Add tests for source location.

Sam Jaffe 6 سال پیش
والد
کامیت
288374115c
4فایلهای تغییر یافته به همراه49 افزوده شده و 7 حذف شده
  1. 0 1
      include/logger/logger.h
  2. 2 0
      include/logger/logger_fwd.h
  3. 12 2
      src/loggers/json_layout.cxx
  4. 35 4
      test/json_layout_test.cxx

+ 0 - 1
include/logger/logger.h

@@ -26,7 +26,6 @@
 #include "logger_fwd.h"
 #include "format.h"
 
-#define log_here { __FILE__, __LINE__, STRING(FUNCTION) }
 #define log_message( logger, lvl, ... )   \
   logger.log(level::lvl, log_here, __VA_ARGS__)
 

+ 2 - 0
include/logger/logger_fwd.h

@@ -9,6 +9,8 @@
 
 #include <string>
 
+#define log_here { __FILE__, __LINE__, __FUNCTION__ }
+
 namespace logging {
   enum class level : int;
   struct logpacket;

+ 12 - 2
src/loggers/json_layout.cxx

@@ -27,7 +27,7 @@ public:
   
 private:
   Json::StreamWriterBuilder build;
-  bool eol_, log_as_json_;
+  bool eol_, log_as_json_, include_location_;
 };
 
 using namespace logging::property;
@@ -48,11 +48,16 @@ std::shared_ptr<layout> json_layout::create(properties const & props) {
 
 json_layout::json_layout(properties const & props)
 : eol_(props["eventEol"]),
-  log_as_json_(props["objectMessageAsJsonObject"])
+  log_as_json_(props["objectMessageAsJsonObject"]),
+  include_location_(props["locationInfo"])
 {
   build["indentation"] = props["compact"] ? "" : "  ";
 }
 
+char const * filename(char const * str) {
+  return strrchr(str, '/')+1;
+}
+
 void json_layout::format(std::ostream & os, logpacket const & pkt) const {
   Json::Value root;
   root["instant"]["epochSecond"] = (Json::UInt64) pkt.time.tv_sec;
@@ -64,6 +69,11 @@ void json_layout::format(std::ostream & os, logpacket const & pkt) const {
   } else {
     root["message"] = pkt.message.str();
   }
+  if (include_location_) {
+    root["source"]["method"] = pkt.info.function;
+    root["source"]["file"] = filename(pkt.info.filename);
+    root["source"]["line"] = pkt.info.line;
+  }
   std::string data = Json::writeString(build, root);
   // jsoncpp is dumb and writes a newline after each ':' token if
   // the child is an object or array.

+ 35 - 4
test/json_layout_test.cxx

@@ -33,10 +33,6 @@ std::string const formatted_output = R"({
   "message" : "This is a test message"
 })";
 
-std::string const compact_output = "{\"instant\":{\"epochSecond\":"
-  "1554401840,\"nanoOfSecond\":123456000},\"level\":\"WARNING\","
-  "\"loggerName\":\"UnitTest\",\"message\":\"This is a test message\"}";
-
 TEST(JsonLayoutTest, LogsInformationInJSON) {
   using namespace logging;
   auto playout = layouts::instance().get("JsonLayout", {});
@@ -49,6 +45,10 @@ TEST(JsonLayoutTest, LogsInformationInJSON) {
   EXPECT_THAT(ss.str(), Eq(formatted_output));
 }
 
+std::string const compact_output = "{\"instant\":{\"epochSecond\":"
+  "1554401840,\"nanoOfSecond\":123456000},\"level\":\"WARNING\","
+  "\"loggerName\":\"UnitTest\",\"message\":\"This is a test message\"}";
+
 TEST(JsonLayoutTest, CompactMeansNoWhitespace) {
   using namespace logging;
   using namespace logging::property;
@@ -65,6 +65,37 @@ TEST(JsonLayoutTest, CompactMeansNoWhitespace) {
   EXPECT_THAT(ss.str(), Eq(compact_output));
 }
 
+std::string const location_output = R"({
+  "instant" : {
+    "epochSecond" : 1554401840,
+    "nanoOfSecond" : 123456000
+  },
+  "level" : "WARNING",
+  "loggerName" : "UnitTest",
+  "message" : "This is a test message",
+  "source" : {
+    "file" : "json_layout_test.cxx",
+    "line" : 92,
+    "method" : "TestBody"
+  }
+})";
+
+TEST(JsonLayoutTest, ShowsLocationInfo) {
+  using namespace logging;
+  using namespace logging::property;
+  properties const props{_obj({
+    {"locationInfo", _v(true)}
+  })};
+  auto playout = layouts::instance().get("JsonLayout", props);
+
+  std::stringstream ss;
+  playout->format(ss, {{NOW, 123456}, level::warning, log_here, "UnitTest",
+    "This is a test message"});
+  
+  using testing::Eq;
+  EXPECT_THAT(ss.str(), Eq(location_output));
+}
+
 TEST(JsonLayoutTest, EOLPropertyAppendsNewline) {
   using namespace logging;
   using namespace logging::property;