Forráskód Böngészése

Add file/method/line# to patternlayout.

Sam Jaffe 5 éve
szülő
commit
d81a5d92ca
2 módosított fájl, 40 hozzáadás és 2 törlés
  1. 23 0
      src/loggers/pattern_layout_format.cxx
  2. 17 2
      test/pattern_layout_test.cxx

+ 23 - 0
src/loggers/pattern_layout_format.cxx

@@ -37,6 +37,27 @@ namespace logging { namespace {
     }
   };
 
+  struct location_info_gen : public format::generator_t {
+    enum { method, line, file } where;
+    constexpr static const decltype(where) format_codes[] = {
+      ['F'] = file,
+      ['M'] = method,
+      ['L'] = line,
+    };
+
+    location_info_gen(char wh) : where(format_codes[wh]) {}
+    std::string str(logpacket const & lp) const override {
+      switch (where) {
+        case file:
+          return lp.info.filename;
+        case line:
+          return std::to_string(lp.info.line);
+        case method:
+          return lp.info.function;
+      }
+    }
+  };
+
   struct message_gen : public format::generator_t {
     std::string str(logpacket const & lp) const override {
       return lp.message.str();
@@ -89,6 +110,8 @@ namespace logging {
       return std::make_shared<message_gen>();
     } else if (is('t')) {
       return std::make_shared<literal_gen>("???");
+    } else if (is('F') || is('M') || is('L')) {
+      return std::make_shared<location_info_gen>(*next);
     } else {
       std::string error_msg{"unknown format character: '"};
       throw unknown_format_specifier{error_msg + *next + "'"};

+ 17 - 2
test/pattern_layout_test.cxx

@@ -37,8 +37,8 @@ std::string DoFormat(std::string const & fmt,
 
 using namespace logging;
 
-logpacket getpkt(std::string const & msg) {
-  return logpacket{{}, level::error, {}, "UNIT_TEST", msg};
+logpacket getpkt(std::string const & msg, location_info info = {}) {
+  return logpacket{{}, level::error, info, "UNIT_TEST", msg};
 };
 
 TEST(PatternLayoutTest, EmptyFormatterCanParse) {
@@ -153,6 +153,21 @@ TEST(PatternLayoutTest, LogMessageIsMToken) {
               Eq("HELLO"));
 }
 
+TEST(PatternLayoutTest, CanOutputLineNumber) {
+  EXPECT_THAT(std::stoi(DoFormat("%L", getpkt("", log_here))),
+             testing::Eq(__LINE__ - 1));
+}
+
+TEST(PatternLayoutTest, CanOutputFileName) {
+  EXPECT_THAT(DoFormat("%F", getpkt("", log_here)),
+             testing::EndsWith("pattern_layout_test.cxx"));
+}
+
+TEST(PatternLayoutTest, CanOutputCallingMethod) {
+  EXPECT_THAT(DoFormat("%M", getpkt("", log_here)),
+             testing::Eq("TestBody"));
+}
+
 TEST(PatternLayoutTest, ThrowsOnUnknownToken) {
   using testing::Eq;
   EXPECT_THROW(GetPatternLayout("%q"),