]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
rec: Escape (by prepending "PDNS") message keys that are special to systemd-journal
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Mon, 12 Jun 2023 07:40:18 +0000 (09:40 +0200)
committerOtto Moerbeek <otto.moerbeek@open-xchange.com>
Mon, 12 Jun 2023 08:03:12 +0000 (10:03 +0200)
pdns/misc.hh
pdns/recursordist/rec-main.cc

index 8800cd7f5390bb3b4e623c1397b5bbca1ee8d5ad..5757cccc5c27f589aac3ca06744ff474c5c290c7 100644 (file)
@@ -414,17 +414,21 @@ struct CIStringCompare
 
 struct CIStringComparePOSIX
 {
-   bool operator() (const std::string& lhs, const std::string& rhs)
+   bool operator() (const std::string& lhs, const std::string& rhs) const
    {
-      std::string::const_iterator a,b;
       const std::locale &loc = std::locale("POSIX");
-      a=lhs.begin();b=rhs.begin();
-      while(a!=lhs.end()) {
-          if (b==rhs.end() || std::tolower(*b,loc)<std::tolower(*a,loc)) return false;
-          else if (std::tolower(*a,loc)<std::tolower(*b,loc)) return true;
-          ++a;++b;
+      auto lhsIter = lhs.begin();
+      auto rhsIter = rhs.begin();
+      while (lhsIter != lhs.end()) {
+        if (rhsIter == rhs.end() || std::tolower(*rhsIter,loc) < std::tolower(*lhsIter,loc)) {
+          return false;
+        }
+        if (std::tolower(*lhsIter,loc) < std::tolower(*rhsIter,loc)) {
+          return true;
+        }
+        ++lhsIter;++rhsIter;
       }
-      return (b!=rhs.end());
+      return rhsIter != rhs.end();
    }
 };
 
index 416609fa70a9ea4927d0662be7f8bcf5cef1821a..c63874c8413b091d992abc101ba7f33e8fb5b448 100644 (file)
@@ -905,9 +905,32 @@ static const char* toTimestampStringMilli(const struct timeval& tval, std::array
   return buf.data();
 }
 
+#define HAVE_SYSTEMD
 #ifdef HAVE_SYSTEMD
 static void loggerSDBackend(const Logging::Entry& entry)
 {
+  static const set<std::string, CIStringComparePOSIX> special = {
+    "message",
+    "message_id",
+    "priority",
+    "code_file",
+    "code_line",
+    "code_func",
+    "errno",
+    "invocation_id",
+    "user_invocation_id",
+    "syslog_facility",
+    "syslog_identifier",
+    "syslog_pid",
+    "syslog_timestamp",
+    "syslog_raw",
+    "documentation",
+    "tid",
+    "unit",
+    "user_unit",
+    "object_pid"
+  };
+
   // First map SL priority to syslog's Urgency
   Logger::Urgency u = entry.d_priority ? Logger::Urgency(entry.d_priority) : Logger::Info;
   if (u > s_logUrgency) {
@@ -931,8 +954,13 @@ static void loggerSDBackend(const Logging::Entry& entry)
   }
   std::array<char, 64> timebuf{};
   appendKeyAndVal("TIMESTAMP", toTimestampStringMilli(entry.d_timestamp, timebuf));
-  for (auto const& v : entry.values) {
-    appendKeyAndVal(toUpper(v.first), v.second);
+  for (const auto& value : entry.values) {
+    if (value.first.at(0) == '_' || special.count(value.first) != 0) {
+      string key{"PDNS"};
+      key.append(value.first);
+      appendKeyAndVal(toUpper(key), value.second);
+    }
+    appendKeyAndVal(toUpper(value.first), value.second);
   }
   // Thread id filled in by backend, since the SL code does not know about RecursorThreads
   // We use the Recursor thread, other threads get id 0. May need to revisit.