xref: /openbmc/phosphor-power/phosphor-regulators/src/journal.hpp (revision 92261f88729b618b1c31d20f28328a8aff73b83b)
17c5d7b27SShawn McCarney /**
27c5d7b27SShawn McCarney  * Copyright © 2020 IBM Corporation
37c5d7b27SShawn McCarney  *
47c5d7b27SShawn McCarney  * Licensed under the Apache License, Version 2.0 (the "License");
57c5d7b27SShawn McCarney  * you may not use this file except in compliance with the License.
67c5d7b27SShawn McCarney  * You may obtain a copy of the License at
77c5d7b27SShawn McCarney  *
87c5d7b27SShawn McCarney  *     http://www.apache.org/licenses/LICENSE-2.0
97c5d7b27SShawn McCarney  *
107c5d7b27SShawn McCarney  * Unless required by applicable law or agreed to in writing, software
117c5d7b27SShawn McCarney  * distributed under the License is distributed on an "AS IS" BASIS,
127c5d7b27SShawn McCarney  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137c5d7b27SShawn McCarney  * See the License for the specific language governing permissions and
147c5d7b27SShawn McCarney  * limitations under the License.
157c5d7b27SShawn McCarney  */
167c5d7b27SShawn McCarney #pragma once
177c5d7b27SShawn McCarney 
18ca08a790SBob King #include <systemd/sd-journal.h>
19ca08a790SBob King 
205248b8abSShawn McCarney #include <phosphor-logging/log.hpp>
215248b8abSShawn McCarney 
227c5d7b27SShawn McCarney #include <string>
235248b8abSShawn McCarney #include <vector>
245248b8abSShawn McCarney 
255248b8abSShawn McCarney namespace phosphor::power::regulators
265248b8abSShawn McCarney {
275248b8abSShawn McCarney 
285248b8abSShawn McCarney /**
295248b8abSShawn McCarney  * @class Journal
305248b8abSShawn McCarney  *
315248b8abSShawn McCarney  * Abstract base class that provides a journal interface.
325248b8abSShawn McCarney  *
335248b8abSShawn McCarney  * The interface is used to write messages/log entries to the system journal.
345248b8abSShawn McCarney  */
355248b8abSShawn McCarney class Journal
365248b8abSShawn McCarney {
375248b8abSShawn McCarney   public:
385248b8abSShawn McCarney     // Specify which compiler-generated methods we want
395248b8abSShawn McCarney     Journal() = default;
405248b8abSShawn McCarney     Journal(const Journal&) = delete;
415248b8abSShawn McCarney     Journal(Journal&&) = delete;
425248b8abSShawn McCarney     Journal& operator=(const Journal&) = delete;
435248b8abSShawn McCarney     Journal& operator=(Journal&&) = delete;
445248b8abSShawn McCarney     virtual ~Journal() = default;
455248b8abSShawn McCarney 
465248b8abSShawn McCarney     /**
47a528a281SShawn McCarney      * Gets the journal messages that have the specified field set to the
48a528a281SShawn McCarney      * specified value.
49a528a281SShawn McCarney      *
50a528a281SShawn McCarney      * The messages in the returned vector are ordered from oldest to newest.
51a528a281SShawn McCarney      *
52a528a281SShawn McCarney      * @param field journal field name
53a528a281SShawn McCarney      * @param fieldValue expected field value
54a528a281SShawn McCarney      * @param max Maximum number of messages to return.  Specify 0 to return all
55a528a281SShawn McCarney      *            matching messages.
56a528a281SShawn McCarney      * @return matching messages from the journal
57a528a281SShawn McCarney      */
58*92261f88SPatrick Williams     virtual std::vector<std::string> getMessages(const std::string& field,
59*92261f88SPatrick Williams                                                  const std::string& fieldValue,
60a528a281SShawn McCarney                                                  unsigned int max = 0) = 0;
61a528a281SShawn McCarney 
62a528a281SShawn McCarney     /**
635248b8abSShawn McCarney      * Logs a debug message in the system journal.
645248b8abSShawn McCarney      *
655248b8abSShawn McCarney      * @param message message to log
665248b8abSShawn McCarney      */
675248b8abSShawn McCarney     virtual void logDebug(const std::string& message) = 0;
685248b8abSShawn McCarney 
695248b8abSShawn McCarney     /**
705248b8abSShawn McCarney      * Logs debug messages in the system journal.
715248b8abSShawn McCarney      *
725248b8abSShawn McCarney      * @param messages messages to log
735248b8abSShawn McCarney      */
745248b8abSShawn McCarney     virtual void logDebug(const std::vector<std::string>& messages) = 0;
755248b8abSShawn McCarney 
765248b8abSShawn McCarney     /**
775248b8abSShawn McCarney      * Logs an error message in the system journal.
785248b8abSShawn McCarney      *
795248b8abSShawn McCarney      * @param message message to log
805248b8abSShawn McCarney      */
815248b8abSShawn McCarney     virtual void logError(const std::string& message) = 0;
825248b8abSShawn McCarney 
835248b8abSShawn McCarney     /**
845248b8abSShawn McCarney      * Logs error messages in the system journal.
855248b8abSShawn McCarney      *
865248b8abSShawn McCarney      * @param messages messages to log
875248b8abSShawn McCarney      */
885248b8abSShawn McCarney     virtual void logError(const std::vector<std::string>& messages) = 0;
895248b8abSShawn McCarney 
905248b8abSShawn McCarney     /**
915248b8abSShawn McCarney      * Logs an informational message in the system journal.
925248b8abSShawn McCarney      *
935248b8abSShawn McCarney      * @param message message to log
945248b8abSShawn McCarney      */
955248b8abSShawn McCarney     virtual void logInfo(const std::string& message) = 0;
965248b8abSShawn McCarney 
975248b8abSShawn McCarney     /**
985248b8abSShawn McCarney      * Logs informational messages in the system journal.
995248b8abSShawn McCarney      *
1005248b8abSShawn McCarney      * @param messages messages to log
1015248b8abSShawn McCarney      */
1025248b8abSShawn McCarney     virtual void logInfo(const std::vector<std::string>& messages) = 0;
1035248b8abSShawn McCarney };
1045248b8abSShawn McCarney 
1055248b8abSShawn McCarney /**
1065248b8abSShawn McCarney  * @class SystemdJournal
1075248b8abSShawn McCarney  *
1085248b8abSShawn McCarney  * Implementation of the Journal interface that writes to the systemd journal.
1095248b8abSShawn McCarney  */
1105248b8abSShawn McCarney class SystemdJournal : public Journal
1115248b8abSShawn McCarney {
1125248b8abSShawn McCarney   public:
1135248b8abSShawn McCarney     // Specify which compiler-generated methods we want
1145248b8abSShawn McCarney     SystemdJournal() = default;
1155248b8abSShawn McCarney     SystemdJournal(const SystemdJournal&) = delete;
1165248b8abSShawn McCarney     SystemdJournal(SystemdJournal&&) = delete;
1175248b8abSShawn McCarney     SystemdJournal& operator=(const SystemdJournal&) = delete;
1185248b8abSShawn McCarney     SystemdJournal& operator=(SystemdJournal&&) = delete;
1195248b8abSShawn McCarney     virtual ~SystemdJournal() = default;
1205248b8abSShawn McCarney 
121ca08a790SBob King     /** @copydoc Journal::getMessages() */
122*92261f88SPatrick Williams     virtual std::vector<std::string> getMessages(const std::string& field,
123*92261f88SPatrick Williams                                                  const std::string& fieldValue,
124ca08a790SBob King                                                  unsigned int max) override;
125ca08a790SBob King 
1265248b8abSShawn McCarney     /** @copydoc Journal::logDebug(const std::string&) */
logDebug(const std::string & message)1275248b8abSShawn McCarney     virtual void logDebug(const std::string& message) override
1285248b8abSShawn McCarney     {
1295248b8abSShawn McCarney         using namespace phosphor::logging;
1305248b8abSShawn McCarney         log<level::DEBUG>(message.c_str());
1315248b8abSShawn McCarney     }
1325248b8abSShawn McCarney 
1335248b8abSShawn McCarney     /** @copydoc Journal::logDebug(const std::vector<std::string>&) */
logDebug(const std::vector<std::string> & messages)1345248b8abSShawn McCarney     virtual void logDebug(const std::vector<std::string>& messages) override
1355248b8abSShawn McCarney     {
1365248b8abSShawn McCarney         for (const std::string& message : messages)
1375248b8abSShawn McCarney         {
1385248b8abSShawn McCarney             logDebug(message);
1395248b8abSShawn McCarney         }
1405248b8abSShawn McCarney     }
1415248b8abSShawn McCarney 
1425248b8abSShawn McCarney     /** @copydoc Journal::logError(const std::string&) */
logError(const std::string & message)1435248b8abSShawn McCarney     virtual void logError(const std::string& message) override
1445248b8abSShawn McCarney     {
1455248b8abSShawn McCarney         using namespace phosphor::logging;
1465248b8abSShawn McCarney         log<level::ERR>(message.c_str());
1475248b8abSShawn McCarney     }
1485248b8abSShawn McCarney 
1495248b8abSShawn McCarney     /** @copydoc Journal::logError(const std::vector<std::string>&) */
logError(const std::vector<std::string> & messages)1505248b8abSShawn McCarney     virtual void logError(const std::vector<std::string>& messages) override
1515248b8abSShawn McCarney     {
1525248b8abSShawn McCarney         for (const std::string& message : messages)
1535248b8abSShawn McCarney         {
1545248b8abSShawn McCarney             logError(message);
1555248b8abSShawn McCarney         }
1565248b8abSShawn McCarney     }
1575248b8abSShawn McCarney 
1585248b8abSShawn McCarney     /** @copydoc Journal::logInfo(const std::string&) */
logInfo(const std::string & message)1595248b8abSShawn McCarney     virtual void logInfo(const std::string& message) override
1605248b8abSShawn McCarney     {
1615248b8abSShawn McCarney         using namespace phosphor::logging;
1625248b8abSShawn McCarney         log<level::INFO>(message.c_str());
1635248b8abSShawn McCarney     }
1645248b8abSShawn McCarney 
1655248b8abSShawn McCarney     /** @copydoc Journal::logInfo(const std::vector<std::string>&) */
logInfo(const std::vector<std::string> & messages)1665248b8abSShawn McCarney     virtual void logInfo(const std::vector<std::string>& messages) override
1675248b8abSShawn McCarney     {
1685248b8abSShawn McCarney         for (const std::string& message : messages)
1695248b8abSShawn McCarney         {
1705248b8abSShawn McCarney             logInfo(message);
1715248b8abSShawn McCarney         }
1725248b8abSShawn McCarney     }
173ca08a790SBob King 
174ca08a790SBob King   private:
175ca08a790SBob King     /**
176a528a281SShawn McCarney      * Gets the value of the specified field for the current journal entry.
177ca08a790SBob King      *
178a528a281SShawn McCarney      * Returns an empty string if the current journal entry does not have the
179a528a281SShawn McCarney      * specified field.
180a528a281SShawn McCarney      *
181a528a281SShawn McCarney      * @param journal current journal entry
182a528a281SShawn McCarney      * @param field journal field name
183a528a281SShawn McCarney      * @return field value
184ca08a790SBob King      */
185a528a281SShawn McCarney     std::string getFieldValue(sd_journal* journal, const std::string& field);
186a528a281SShawn McCarney 
187a528a281SShawn McCarney     /**
188a528a281SShawn McCarney      * Gets the realtime (wallclock) timestamp for the current journal entry.
189a528a281SShawn McCarney      *
190a528a281SShawn McCarney      * @param journal current journal entry
191a528a281SShawn McCarney      * @return timestamp as a date/time string
192a528a281SShawn McCarney      */
193a528a281SShawn McCarney     std::string getTimeStamp(sd_journal* journal);
1945248b8abSShawn McCarney };
1955248b8abSShawn McCarney 
1965248b8abSShawn McCarney } // namespace phosphor::power::regulators
197