diff --git a/sensor-monitor/threshold_alarm_logger.cpp b/sensor-monitor/threshold_alarm_logger.cpp
index b2fd7e8..03b35ba 100644
--- a/sensor-monitor/threshold_alarm_logger.cpp
+++ b/sensor-monitor/threshold_alarm_logger.cpp
@@ -44,6 +44,9 @@
 constexpr auto valueInterface = "xyz.openbmc_project.Sensor.Value";
 constexpr auto assocInterface = "xyz.openbmc_project.Association";
 
+const std::vector<std::string> thresholdIfaceNames{
+    warningInterface, criticalInterface, perfLossInterface};
+
 using ErrorData = std::tuple<ErrorName, Entry::Level>;
 
 /**
@@ -112,7 +115,12 @@
                        "type='signal',member='InterfacesRemoved',arg0path="
                        "'/xyz/openbmc_project/sensors/'",
                        std::bind(&ThresholdAlarmLogger::interfacesRemoved, this,
-                                 std::placeholders::_1))
+                                 std::placeholders::_1)),
+    ifacesAddedMatch(bus,
+                     "type='signal',member='InterfacesAdded',arg0path="
+                     "'/xyz/openbmc_project/sensors/'",
+                     std::bind(&ThresholdAlarmLogger::interfacesAdded, this,
+                               std::placeholders::_1))
 {
     _powerState->addCallback("thresholdMon",
                              std::bind(&ThresholdAlarmLogger::powerStateChanged,
@@ -143,6 +151,47 @@
 
     msg.read(interface, properties);
 
+    checkProperties(sensorPath, interface, properties);
+}
+
+void ThresholdAlarmLogger::interfacesRemoved(sdbusplus::message_t& msg)
+{
+    sdbusplus::message::object_path path;
+    std::vector<std::string> interfaces;
+
+    msg.read(path, interfaces);
+
+    for (const auto& interface : interfaces)
+    {
+        if (std::find(thresholdIfaceNames.begin(), thresholdIfaceNames.end(),
+                      interface) != thresholdIfaceNames.end())
+        {
+            alarms.erase(InterfaceKey{path, interface});
+        }
+    }
+}
+
+void ThresholdAlarmLogger::interfacesAdded(sdbusplus::message_t& msg)
+{
+    sdbusplus::message::object_path path;
+    std::map<std::string, std::map<std::string, std::variant<bool>>> interfaces;
+
+    msg.read(path, interfaces);
+
+    for (const auto& [interface, properties] : interfaces)
+    {
+        if (std::find(thresholdIfaceNames.begin(), thresholdIfaceNames.end(),
+                      interface) != thresholdIfaceNames.end())
+        {
+            checkProperties(path, interface, properties);
+        }
+    }
+}
+
+void ThresholdAlarmLogger::checkProperties(
+    const std::string& sensorPath, const std::string& interface,
+    const std::map<std::string, std::variant<bool>>& properties)
+{
     auto alarmProperties = thresholdData.find(interface);
     if (alarmProperties == thresholdData.end())
     {
@@ -180,25 +229,6 @@
     }
 }
 
-void ThresholdAlarmLogger::interfacesRemoved(sdbusplus::message_t& msg)
-{
-    static const std::vector<std::string> thresholdNames{
-        warningInterface, criticalInterface, perfLossInterface};
-    sdbusplus::message::object_path path;
-    std::vector<std::string> interfaces;
-
-    msg.read(path, interfaces);
-
-    for (const auto& interface : interfaces)
-    {
-        if (std::find(thresholdNames.begin(), thresholdNames.end(),
-                      interface) != thresholdNames.end())
-        {
-            alarms.erase(InterfaceKey{path, interface});
-        }
-    }
-}
-
 void ThresholdAlarmLogger::checkThresholds(const std::string& interface,
                                            const std::string& sensorPath,
                                            const std::string& service)
diff --git a/sensor-monitor/threshold_alarm_logger.hpp b/sensor-monitor/threshold_alarm_logger.hpp
index 8659ea7..f7b00c5 100644
--- a/sensor-monitor/threshold_alarm_logger.hpp
+++ b/sensor-monitor/threshold_alarm_logger.hpp
@@ -91,6 +91,28 @@
     void interfacesRemoved(sdbusplus::message_t& msg);
 
     /**
+     * @brief The interfacesAdded handler for the threshold
+     *        interfaces.
+     *
+     * Checks the alarm when it shows up on D-Bus.
+     *
+     * @param[in] msg - The signal message payload.
+     */
+    void interfacesAdded(sdbusplus::message_t& msg);
+
+    /**
+     * @brief Checks for alarms in the D-Bus data passed in,
+     *        and creates an event log if necessary.
+     *
+     * @param[in] sensorPath - D-Bus path of the sensor
+     * @param[in] interface - The threshold interface name
+     * @param[in] properties - The map of property values on the interface
+     */
+    void checkProperties(
+        const std::string& sensorPath, const std::string& interface,
+        const std::map<std::string, std::variant<bool>>& properties);
+
+    /**
      * @brief Checks for active alarms on the path and threshold interface
      *        passed in and creates event logs if necessary.
      *
@@ -202,6 +224,11 @@
     sdbusplus::bus::match_t ifacesRemovedMatch;
 
     /**
+     * @brief The InterfacesAdded match object
+     */
+    sdbusplus::bus::match_t ifacesAddedMatch;
+
+    /**
      * @brief The current alarm values
      */
     std::map<InterfaceKey, std::map<PropertyName, bool>> alarms;
