diff --git a/monitor/fan.cpp b/monitor/fan.cpp
index 6abd2da..b5092c0 100644
--- a/monitor/fan.cpp
+++ b/monitor/fan.cpp
@@ -15,6 +15,7 @@
  */
 #include "fan.hpp"
 
+#include "logging.hpp"
 #include "sdbusplus.hpp"
 #include "system.hpp"
 #include "types.hpp"
@@ -55,7 +56,8 @@
                    std::bind(std::mem_fn(&Fan::presenceChanged), this,
                              std::placeholders::_1))
 {
-    // Start from a known state of functional
+    // Start from a known state of functional (even if
+    // _numSensorFailsForNonFunc is 0)
     updateInventory(true);
 
     // Setup tach sensors for monitoring
@@ -74,8 +76,11 @@
         }
         catch (InvalidSensorError& e)
         {
-            // Count the number of failed tach sensors
-            if (++_numFailedSensor >= _numSensorFailsForNonFunc)
+            // Count the number of failed tach sensors, though if
+            // _numSensorFailsForNonFunc is zero that means the fan should not
+            // be set to nonfunctional.
+            if (_numSensorFailsForNonFunc &&
+                (++_numFailedSensor >= _numSensorFailsForNonFunc))
             {
                 // Mark associated fan as nonfunctional
                 updateInventory(false);
@@ -212,30 +217,39 @@
 {
     sensor.setFunctional(!sensor.functional());
 
-    // If the fan was nonfunctional and enough sensors are now OK,
-    // the fan can go back to functional
-    if (!_functional && !tooManySensorsNonfunctional())
+    getLogger().log(
+        fmt::format("Setting tach sensor {} functional state to {}. "
+                    "Actual speed: {} Target speed: {}",
+                    sensor.name(), sensor.functional(), sensor.getInput(),
+                    sensor.getTarget()));
+
+    // A zero value for _numSensorFailsForNonFunc means we aren't dealing
+    // with fan FRU functional status, only sensor functional status.
+    if (_numSensorFailsForNonFunc)
     {
-        log<level::INFO>(
-            fmt::format("Setting fan {} back to functional", _name).c_str());
+        // If the fan was nonfunctional and enough sensors are now OK,
+        // the fan can go back to functional
+        if (!_functional && !tooManySensorsNonfunctional())
+        {
+            getLogger().log(
+                fmt::format("Setting fan {} back to functional", _name));
 
-        updateInventory(true);
-    }
+            updateInventory(true);
+        }
 
-    // If the fan is currently functional, but too many
-    // contained sensors are now nonfunctional, update
-    // the whole fan nonfunctional.
-    if (_functional && tooManySensorsNonfunctional())
-    {
-        log<level::ERR>(fmt::format("Setting fan {} to nonfunctional "
-                                    "Sensor: {} "
-                                    "Actual speed: {} "
-                                    "Target speed: {}",
-                                    _name, sensor.name(), sensor.getInput(),
-                                    sensor.getTarget())
-                            .c_str());
-
-        updateInventory(false);
+        // If the fan is currently functional, but too many
+        // contained sensors are now nonfunctional, update
+        // the whole fan nonfunctional.
+        if (_functional && tooManySensorsNonfunctional())
+        {
+            getLogger().log(fmt::format("Setting fan {} to nonfunctional "
+                                        "Sensor: {} "
+                                        "Actual speed: {} "
+                                        "Target speed: {}",
+                                        _name, sensor.name(), sensor.getInput(),
+                                        sensor.getTarget()));
+            updateInventory(false);
+        }
     }
 
     _system.fanStatusChange(*this);
