diff --git a/phosphor-regulators/src/journal.cpp b/phosphor-regulators/src/journal.cpp
new file mode 100644
index 0000000..5139945
--- /dev/null
+++ b/phosphor-regulators/src/journal.cpp
@@ -0,0 +1,42 @@
+/**
+ * Copyright © 2020 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "journal.hpp"
+
+#include <phosphor-logging/log.hpp>
+
+using namespace phosphor::logging;
+
+/**
+ * This is the standard implementation of the journal interface.  It calls
+ * phosphor-logging functions to create real systemd journal entries.
+ *
+ * Testcases should link with the file mock_journal.cpp instead.
+ */
+namespace phosphor::power::regulators::journal
+{
+
+void logErr(const std::string& message)
+{
+    log<level::ERR>(message.c_str());
+}
+
+void logInfo(const std::string& message)
+{
+    log<level::INFO>(message.c_str());
+}
+
+} // namespace phosphor::power::regulators::journal
diff --git a/phosphor-regulators/src/journal.hpp b/phosphor-regulators/src/journal.hpp
new file mode 100644
index 0000000..f053c66
--- /dev/null
+++ b/phosphor-regulators/src/journal.hpp
@@ -0,0 +1,49 @@
+/**
+ * Copyright © 2020 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include <string>
+
+/**
+ * Systemd journal interface.
+ *
+ * Provides functions to log informational and error messages to the journal.
+ *
+ * This interface provides an abstraction layer so that testcases can use a mock
+ * implementation and validate the logged messages.
+ *
+ * This interface does not currently provide the ability to specify key/value
+ * pairs to provide more information in the journal entry.  It will be added
+ * later if needed.
+ */
+namespace phosphor::power::regulators::journal
+{
+
+/**
+ * Logs a message with a priority value of 'ERR' to the systemd journal.
+ *
+ * @param message message to log
+ */
+void logErr(const std::string& message);
+
+/**
+ * Logs a message with a priority value of 'INFO' to the systemd journal.
+ *
+ * @param message message to log
+ */
+void logInfo(const std::string& message);
+
+} // namespace phosphor::power::regulators::journal
diff --git a/phosphor-regulators/src/meson.build b/phosphor-regulators/src/meson.build
index ef40cb9..3caa543 100644
--- a/phosphor-regulators/src/meson.build
+++ b/phosphor-regulators/src/meson.build
@@ -30,11 +30,13 @@
 
 phosphor_regulators = executable(
     'phosphor-regulators',
+    'journal.cpp',
     'main.cpp',
     dependencies: [
+        libi2c_dep,
+        phosphor_logging,
         sdbusplus,
-        sdeventplus,
-        libi2c_dep
+        sdeventplus
     ],
     link_with: phosphor_regulators_library,
     implicit_include_directories: false,
diff --git a/phosphor-regulators/test/meson.build b/phosphor-regulators/test/meson.build
index 1608961..10dace9 100644
--- a/phosphor-regulators/test/meson.build
+++ b/phosphor-regulators/test/meson.build
@@ -10,6 +10,7 @@
     'configuration_tests.cpp',
     'device_tests.cpp',
     'id_map_tests.cpp',
+    'mock_journal.cpp',
     'pmbus_error_tests.cpp',
     'pmbus_utils_tests.cpp',
     'presence_detection_tests.cpp',
diff --git a/phosphor-regulators/test/mock_journal.cpp b/phosphor-regulators/test/mock_journal.cpp
new file mode 100644
index 0000000..2446182
--- /dev/null
+++ b/phosphor-regulators/test/mock_journal.cpp
@@ -0,0 +1,65 @@
+/**
+ * Copyright © 2020 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "mock_journal.hpp"
+
+/**
+ * This is the mock implementation of the journal interface.  It just stores the
+ * journal messages in static vectors.
+ *
+ * Executables that need to log real systemd journal messages should link with
+ * the file journal.cpp instead.
+ */
+namespace phosphor::power::regulators::journal
+{
+
+/**
+ * Mock journal messages with a priority value of 'ERR'.
+ */
+static std::vector<std::string> errMessages{};
+
+/**
+ * Mock journal messages with a priority value of 'INFO'.
+ */
+static std::vector<std::string> infoMessages{};
+
+void clear()
+{
+    errMessages.clear();
+    infoMessages.clear();
+}
+
+const std::vector<std::string>& getErrMessages()
+{
+    return errMessages;
+}
+
+const std::vector<std::string>& getInfoMessages()
+{
+    return infoMessages;
+}
+
+void logErr(const std::string& message)
+{
+    errMessages.emplace_back(message);
+}
+
+void logInfo(const std::string& message)
+{
+    infoMessages.emplace_back(message);
+}
+
+} // namespace phosphor::power::regulators::journal
diff --git a/phosphor-regulators/test/mock_journal.hpp b/phosphor-regulators/test/mock_journal.hpp
new file mode 100644
index 0000000..8e2a255
--- /dev/null
+++ b/phosphor-regulators/test/mock_journal.hpp
@@ -0,0 +1,51 @@
+/**
+ * Copyright © 2020 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include "journal.hpp"
+
+#include <string>
+#include <vector>
+
+/**
+ * Extensions to the systemd journal interface.
+ *
+ * Provides functions to access and clear mock journal messages that have been
+ * logged.  These functions should only be used by testcases.
+ */
+namespace phosphor::power::regulators::journal
+{
+
+/**
+ * Clears all mock journal messages.
+ */
+void clear();
+
+/**
+ * Returns all mock journal messages with a priority value of 'ERR'.
+ *
+ * @return mock error messages
+ */
+const std::vector<std::string>& getErrMessages();
+
+/**
+ * Returns all mock journal messages with a priority value of 'INFO'.
+ *
+ * @return mock informational messages
+ */
+const std::vector<std::string>& getInfoMessages();
+
+} // namespace phosphor::power::regulators::journal
