diff --git a/extensions/openpower-pels/registry.cpp b/extensions/openpower-pels/registry.cpp
index 87d9875..9cccb0b 100644
--- a/extensions/openpower-pels/registry.cpp
+++ b/extensions/openpower-pels/registry.cpp
@@ -578,6 +578,58 @@
     return getCalloutsWithoutAD((*it)["Callouts"], systemNames);
 }
 
+/**
+ * @brief Returns the journal capture information
+ *
+ *  The JSON looks like:
+ *    "JournalCapture": {
+ *        "NumLines": 30
+ *    }
+ *
+ *    "JournalCapture":
+ *    {
+ *        "Sections": [
+ *            {
+ *                "SyslogID": "phosphor-log-manager",
+ *                "NumLines": 20
+ *            }
+ *        ]
+ *    }
+ *
+ * @param json - The journal capture JSON
+ * @return JournalCapture - The filled in variant
+ */
+JournalCapture getJournalCapture(const nlohmann::json& json)
+{
+    JournalCapture capt;
+
+    // Primary key is either NumLines or Sections.
+    if (json.contains("NumLines"))
+    {
+        capt = json.at("NumLines").get<size_t>();
+    }
+    else if (json.contains("Sections"))
+    {
+        AppCaptureList captures;
+        for (const auto& capture : json.at("Sections"))
+        {
+            AppCapture ac;
+            ac.syslogID = capture.at("SyslogID").get<std::string>();
+            ac.numLines = capture.at("NumLines").get<size_t>();
+            captures.push_back(std::move(ac));
+        }
+
+        capt = captures;
+    }
+    else
+    {
+        log<level::ERR>("JournalCapture section not the right format");
+        throw std::runtime_error{"JournalCapture section not the right format"};
+    }
+
+    return capt;
+}
+
 } // namespace helper
 
 std::optional<Entry> Registry::lookup(const std::string& name, LookupType type,
@@ -704,6 +756,12 @@
                 }
             }
 
+            if (e->contains("JournalCapture"))
+            {
+                entry.journalCapture =
+                    helper::getJournalCapture((*e)["JournalCapture"]);
+            }
+
             return entry;
         }
         catch (const std::exception& ex)
diff --git a/extensions/openpower-pels/registry.hpp b/extensions/openpower-pels/registry.hpp
index f5888b3..7ee5979 100644
--- a/extensions/openpower-pels/registry.hpp
+++ b/extensions/openpower-pels/registry.hpp
@@ -6,6 +6,7 @@
 #include <filesystem>
 #include <optional>
 #include <string>
+#include <variant>
 #include <vector>
 
 namespace openpower
@@ -107,6 +108,17 @@
     SRC() : type(0), reasonCode(0) {}
 };
 
+struct AppCapture
+{
+    std::string syslogID;
+    size_t numLines;
+};
+
+// Can specify either the syslog IDs to capture along with how many
+// entries of each, or just how many entries to get the full journal.
+using AppCaptureList = std::vector<AppCapture>;
+using JournalCapture = std::variant<size_t, AppCaptureList>;
+
 /**
  * @brief Represents a message registry entry, which is used for creating a
  *        PEL from an OpenBMC event log.
@@ -180,6 +192,11 @@
      * @brief The callout JSON, if the entry has callouts.
      */
     std::optional<nlohmann::json> callouts;
+
+    /**
+     * @brief The journal capture instructions, if present.
+     */
+    std::optional<JournalCapture> journalCapture;
 };
 
 /**
diff --git a/test/openpower-pels/registry_test.cpp b/test/openpower-pels/registry_test.cpp
index 6a13fc6..12a205f 100644
--- a/test/openpower-pels/registry_test.cpp
+++ b/test/openpower-pels/registry_test.cpp
@@ -100,6 +100,11 @@
                     "In the UserData section there is a JSON",
                     "dump that provides debug information."
                 ]
+            },
+
+            "JournalCapture":
+            {
+                "NumLines": 7
             }
         },
 
@@ -116,6 +121,36 @@
                 "Description": "A PGOOD Fault",
                 "Message": "PS had a PGOOD Fault"
             }
+        },
+
+        {
+            "Name": "xyz.openbmc_project.Journal.Capture",
+            "Subsystem": "power_supply",
+
+            "SRC":
+            {
+                "ReasonCode": "0x2030"
+            },
+
+            "Documentation":
+            {
+                "Description": "journal capture test",
+                "Message": "journal capture test"
+            },
+
+            "JournalCapture":
+            {
+                "Sections": [
+                    {
+                        "NumLines": 5,
+                        "SyslogID": "test1"
+                    },
+                    {
+                        "NumLines": 6,
+                        "SyslogID": "test2"
+                    }
+                ]
+            }
         }
     ]
 }
@@ -214,6 +249,11 @@
     EXPECT_EQ((*hexwordSource).size(), 1);
     EXPECT_EQ((*hexwordSource).front(), "SRCWord6");
 
+    const auto& jc = entry->journalCapture;
+    ASSERT_TRUE(jc);
+    ASSERT_TRUE(std::holds_alternative<size_t>(*jc));
+    EXPECT_EQ(std::get<size_t>(*jc), 7);
+
     entry = registry.lookup("0x2333", LookupType::reasonCode);
     ASSERT_TRUE(entry);
     EXPECT_EQ(entry->name, "xyz.openbmc_project.Power.OverVoltage");
@@ -723,3 +763,26 @@
     ASSERT_TRUE(entry);
     EXPECT_FALSE(entry->subsystem);
 }
+
+TEST_F(RegistryTest, TestJournalSectionCapture)
+{
+    auto path = RegistryTest::writeData(registryData);
+    Registry registry{path};
+
+    auto entry = registry.lookup("xyz.openbmc_project.Journal.Capture",
+                                 LookupType::name);
+    ASSERT_TRUE(entry);
+
+    const auto& jc = entry->journalCapture;
+    ASSERT_TRUE(jc);
+    ASSERT_TRUE(std::holds_alternative<AppCaptureList>(*jc));
+    const auto& acl = std::get<AppCaptureList>(*jc);
+
+    ASSERT_EQ(acl.size(), 2);
+
+    EXPECT_EQ(acl[0].syslogID, "test1");
+    EXPECT_EQ(acl[0].numLines, 5);
+
+    EXPECT_EQ(acl[1].syslogID, "test2");
+    EXPECT_EQ(acl[1].numLines, 6);
+}
